微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript-NodeJs forEach请求承诺在返回之前等待所有诺言

问题是我无法兑现任何承诺.他们..只是空了.

我在SO上看到的每个答案都告诉我要做这个,尽管出于某种原因这是行不通的.我不知所措,拉头发,砸键盘.有人可以指出我的愚蠢吗?

var q = require('q');
var request = require('request-promise'); // https://www.npmjs.com/package/request-promise

function findSynonym(searchList) {
    var defer = q.defer();
    var promises = [];
    var url = "http://thesaurus.altervista.org/service.PHP?word=%word%&language=en_US&output=json&key=awesomekeyisawesome";
    var wURL;
    searchList.forEach(function(word){
        wURL = url.replace('%word%',word);
        promises.push(request(wURL));
    });

    q.all(promises).then(function(data){
        console.log('after all->', data); // data is empty
        defer.resolve();
    });

    return defer;
}
var search = ['cookie', 'performance', 'danger'];

findSynonym(search).then(function(supposedDataFromAllPromises) { // TypeError: undefined is not a function [then is not a function]
    console.log('->',supposedDataFromAllPromises); // this never happens
});

解决方法:

您将返回没有.then方法的Deferred对象defer,而不是Promise对象defer.promise.

但是无论如何,那就是deferred antipattern,这里不需要使用延期.只要兑现Promise.all会给您带来的诺言:

function findSynonym(searchList) {
    var url = "http://thesaurus.altervista.org/service.PHP?word=%word%&language=en_US&output=json&key=awesomekeyisawesome";
    var promises = searchList.map(function(word) {
        return request(url.replace('%word%', word));
    });
    return q.all(promises).then(function(data){
        console.log('after all->', data); // data is empty
        return undefined; // that's what you were resolve()ing with
    });
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐