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

我想:

  1. 调用 API 资源

  2. 取回记录数组 - [arr]

  3. forEach over [arr] 并执行某些功能 - 对 API 的另一个 aysnc 调用

  4. 对于每次迭代,创建一个对象,其中包含原始 API 调用的元素以及每个项目的后续调用

  5. 将生成的每个对象实例保存到 Mongo

  6. 在所有必需的保存操作结束时,从 Mongo 调用完整的集合

  7. 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 docs

const allItems = await DocModel.find();


 //Render all docs

 res.render(`aView`, {

   recordings: allItems,

 });

我面临的问题是渲染在 forEach 完成/填充 Mongo 之前执行。


为了尝试解决这个问题,我尝试将 forEach 块包装在 Promise 中,然后 .then res.render ,但这似乎没有效果。


确保所有函数调用在渲染发生之前完成的解决方案是什么?


一只斗牛犬
浏览 138回答 3
3回答

湖上湖

我在下面的代码中放置了两个标记。我删除了这个_.forEach功能mark1:使用普通的for循环来完成mark2:这里使用await//First API call to get [arr]const results = await getlist();// ########## mark1 ########## : Use normal for-loop to do itfor (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 docsconst allItems = await DocModel.find();//Render all docsres.render(`aView`, {    recordings: allItems,});

慕的地8271018

你不能async await在里面使用forEach。相反,您需要使用for...of循环。另一个最佳解决方案是使用Promise.all

肥皂起泡泡

Promise.allawait Promise.all(_.map(results,async result => {    ... existing code });
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript