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

时间:2015-10-10 06:33:38

标签: javascript node.js bluebird

我试图围绕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)时,它不会等到函数解析之后再开始我在process1000()中传递给Promise.map的数组中的下一个项目。只要在addApiData中调用rp(url),就会在数组中的下一个项目上调用addApiData。然后在进程中有一个机会在Promise.map中解析之前过早地调用process1000中的第二个.then()函数。我已经尝试了几个不同的库来提出我的GET请求,但他们都有同样的问题。我在这做错了什么?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

我认为你正在寻找更像这样的东西:

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 constructor antipattern

换句话说,如果您退回承诺,则无需返回then

这两个是等价的:

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

// and

return rp(url);

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