为了账号安全,请及时绑定邮箱和手机立即绑定

如何处理异步 forEach,将结果传递到数据库,然后渲染完整的数据集

如何处理异步 forEach,将结果传递到数据库,然后渲染完整的数据集

一只斗牛犬 2023-07-20 14:48:47
我想:调用 API 资源取回记录数组 - [arr]forEach over [arr] 并执行某些功能 - 对 API 的另一个 aysnc 调用对于每次迭代,创建一个对象,其中包含原始 API 调用的元素以及每个项目的后续调用将生成的每个对象实例保存到 Mongo在所有必需的保存操作结束时,从 Mongo 调用完整的集合res.render 该集合我的代码如下所示://First API call to get [arr]  const results = await getlist();  //Iterate over [arr] and perform a request on each item   _.forEach(results, async function (result) {  //Seconday request for each item in [arr]  const record = await item(result.id).fetch();  //Combined doc from original result and secondary call for record  let doc = new DocModel({    item1: result.id,    item2: record.something,      });  //Save doc  const saveDoc = doc.save();  });//Call for all docsconst allItems = await DocModel.find(); //Render all docs res.render(`aView`, {   recordings: allItems, });我面临的问题是渲染在 forEach 完成/填充 Mongo 之前执行。为了尝试解决这个问题,我尝试将 forEach 块包装在 Promise 中,然后 .then res.render ,但这似乎没有效果。确保所有函数调用在渲染发生之前完成的解决方案是什么?
查看完整描述

3 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

我在下面的代码中放置了两个标记。我删除了这个_.forEach功能


mark1:使用普通的for循环来完成

mark2:这里使用await


//First API call to get [arr]

const results = await getlist();


// ########## mark1 ########## : Use normal for-loop to do it

for (const result of results) {

    //Seconday request for each item in [arr]

    const record = await item(result.id).fetch();


    //Combined doc from original result and secondary call for record

    let doc = new DocModel({

        item1: result.id,

        item2: record.something,


    });

    // ########## mark2 ########## : use await here 

    //Save doc

    const saveDoc = await doc.save();

}


//Call for all docs

const allItems = await DocModel.find();


//Render all docs

res.render(`aView`, {

    recordings: allItems,

});


查看完整回答
反对 回复 2023-07-20
?
慕的地8271018

TA贡献1796条经验 获得超4个赞

你不能async await在里面使用forEach。相反,您需要使用for...of循环。

另一个最佳解决方案是使用Promise.all


查看完整回答
反对 回复 2023-07-20
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

Promise.all

await Promise.all(_.map(results,async result => {
   ... existing code
});


查看完整回答
反对 回复 2023-07-20
  • 3 回答
  • 0 关注
  • 172 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信