【问题标题】:Callback on last promise from an array of Mongo updates从一系列 Mongo 更新中回调最后一个承诺
【发布时间】:2016-05-20 04:30:28
【问题描述】:

我希望在 forEach() 循环期间做出的最后一个承诺返回时调用一个函数。

示例代码:

var mainList = getArrayData()

mainList.forEach((item,i)=>{
    mongooseSchema.find(_id:item.id).exec((err,doc)=>{
        doStuff(doc)
    })
})

第二个块之后的任何代码都将在所有 mongo 查询被发送后立即运行。如果您将整个内容包装在一个 Promise 中(即数组数据来自单独的 mongo 查询),您仍然可以获得相同的效果。

有什么方法可以为最后一个查询设置一个特殊的函数/回调,或者更好的是,在所有查询都返回后返回一个 promise?

谢谢

【问题讨论】:

    标签: node.js mongodb mongoose promise


    【解决方案1】:

    您可以使用 Promise.all。一旦数组中的所有承诺都得到解决,它将触发。

    Promise.all(iterable) 方法返回一个当 iterable 参数中的所有 Promise 都已解析时解析的 Promise,或者以第一个被拒绝的 Promise 的原因拒绝。

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

    var mainList = getArrayData()
    let promises = [];
    
    mainList.forEach((item,i)=>{
        let p = new Promise((resolve, reject) => {
            mongooseSchema.find(_id:item.id).exec((err,doc)=>{
                doStuff(doc)
                resolve();
            });
        });
        promises.push(p);
    });
    
    Promise.all(promises).then(() => {
        // do something when all are resolved
    });
    

    【讨论】:

    • 但请注意:“如果其中一个元素被拒绝,Promise.all 将被拒绝”。
    • 我不会说这是需要“提防”的事情,而是应该通过有效的错误处理方法来计划的事情。
    • 这看起来正是我需要的,谢谢!一旦我得到这个工作,我会标记为已回答。
    猜你喜欢
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 2015-11-27
    相关资源
    最近更新 更多