Promise.map 在继续 .then() 之前不等待解决

Promise.map not waiting for resolution before proceeding to .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);
}

当在 addApiData() 中调用 rp(url) 时,它不会等到函数解析后才开始传递给 Promise.map 的数组中的下一项在进程 1000() 中。一旦在 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);
}

这里的要点是你需要确保你return正在承诺,否则下一个then不会知道如何处理它的价值。

此外,请尽量避免 Promise constructor antipattern

换句话说,如果你return一个承诺,你也不需要returnthen

这两个是等价的:

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

// and

return rp(url);

他们都return一个承诺(rp(url)return一个承诺,rp(url).then( /* ... */)return一个承诺)。