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

标签 javascript node.js bluebird

我在尝试围绕 JavaScript promises 思考时遇到了问题。这是我最近的挫败感:

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。然后调用 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);
}

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

另外,尽量避免 Promise constructor antipattern .

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

这两个是等价的:

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

// and

return rp(url);

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

关于javascript - Promise.map 在继续 .then() 之前不等待解决,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33051069/

相关文章:

javascript - 更改 json 提要响应 - 删除级别

javascript - 如何在我的 javascript 中执行 anchor\href?

javascript - 如何使用 chai js 通过正则表达式检查对象是否包含部分键?

javascript - 如何使用 Node.js 以 70 个请求/秒的速度分发唯一优惠券代码

javascript - 无极 waterfall

javascript - 如何在 Angular 1 中将项目移动到列表前面

git - 如何防止不需要的钩子(Hook)请求?

javascript - Blessed ListTable - 顶行被锁定,无法选择或滚动

javascript - catch 中的请求- promise 堆栈跟踪

node.js - Express 4 - 将 res.json 与 promise.then 链接起来不起作用