【问题标题】:How to promisify a foreach loop如何承诺一个foreach循环
【发布时间】:2021-07-13 19:55:26
【问题描述】:

我有这个功能:

remove(data.toString())
function remove(node){
    Item.findByIdAndDelete(node).then(()=>{
        Item.find({parent: mongoose.Types.ObjectId(node)}).select('_id').then((d)=>{
            d.forEach(e => {
                remove(e._id)
            });
        })
    })
}

我想答应它,以便我可以打电话:

remove(data.toString()).then(()=>{console.log('done')})

我怎样才能做到这一点? 任何帮助将不胜感激!

【问题讨论】:

标签: javascript loops asynchronous promise


【解决方案1】:

你应该:

  • 返回在回调中创建的每个承诺。
  • map 从递归调用中获得的承诺数组(而不是 forEach)并将该数组传递给 Promise.all
  • 扁平化承诺链,避免嵌套的then 回调。
function remove(node) {
    return Item.findByIdAndDelete(node).then(() => {
        return Item.find({parent: mongoose.Types.ObjectId(node)}).select('_id');
    }).then(d => {
        return Promise.all(d.map(e => {
            return remove(e._id)
        }));
    });
}

使用async await 语法时,事情可能会变得更容易阅读:

async function remove(node) {
    await Item.findByIdAndDelete(node);
    let d = await Item.find({parent: mongoose.Types.ObjectId(node)}).select('_id');
    return Promise.all(d.map(e => remove(e._id)));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 2021-10-02
    • 2018-10-13
    • 2019-12-07
    • 2016-02-19
    相关资源
    最近更新 更多