的承诺.在执行.then()之前不等待解析



我有一个问题,试图把我的头脑围绕JavaScript的承诺。以下是我最近的挫折:

var rp = require('request-promise');
function process1000() {
    //gets 1000 objects from DB to process
    get1000objects()
    .then(function (docs) {
        Promise.map(docs, addApiData)
        })
    .then(function (objects) {
            console.log(objects)
        })
    }
function addApiData(element) {
    return rp(url).then(function (res) {
        resolve(res);
    })
        .catch(console.error);
}

当rp(url)在addApiData()中被调用时,它不会等到函数在我传递给Promise的数组中开始下一个项目之前被解析。映射到process1000()中。只要在addApiData中调用rp(url),就会对数组中的下一项调用addApiData。然后调用process1000中的第二个.then()函数,在Promise.map中所有内容都有机会解析之前过早地调用。我尝试了几个不同的库,使我的GET请求,但他们都有同样的问题。我哪里做错了?任何帮助都将非常感激。

我想你在寻找更像这样的东西:

var rp = require('request-promise');
function process1000() {
    //gets 1000 objects from DB to process
    get1000objects()
    .then(function (docs) {
        return Promise.map(docs, addApiData)
    })
    .then(function (objects) {
        console.log(objects);
    })
}
function addApiData(element) {
    return rp(url)
    .catch(console.error);
}

这里的要点是,您需要确保返回承诺,否则下一个then将不知道如何处理它的值。

同时,尽量避免Promise构造函数反模式。

换句话说,如果你返回一个promise,你不需要返回then

return rp(url).then(function(res) { return res; });
// and
return rp(url);

它们都返回一个承诺(rp(url)返回一个承诺,rp(url).then( /* ... */)返回一个承诺)

最新更新