您如何等待过滤器循环的每次迭代,而不是整个循环的完成?

时间:2018-11-30 17:11:31

标签: javascript

基本上,我试图等待过滤器循环的每次迭代,以仅获取record,newAnalyte和userId的对象属性,所有这些属性都需要等待的异步方法,这些方法需要一些时间来处理数据。

其他对象属性是从另一个过滤器循环的迭代派生而来的,因此,我需要等待外部循环+内部循环的每次迭代完成以获取完整的数据对象。

问题是,我从已完成的承诺中得到的是完整循环中的对象数组,而不是每次循环迭代中的每个对象。

我期望的是类似[Object]的东西,相反我得到了[[Object],[Object],[Object]等]。

 odbc.connect();
 const results = reqs.filter(async (item , k) => {
   if (k % 2 == 0) {
       const newAnalyte = item['Analyte Peak Name'].split(' ')[0].toUpperCase();

       const validRow = await odbc.findBatch(req, type, batchId, newAnalyte, seq).catch((e) => console.log(e));

       if (validRow.length > 0) {

         let suffix = "";
         if (reqsuffix.length != 0) {
             suffix = reqsuffix[l]['Sample Name'].slice(-4);
         }

         const dbUser = await sqlCreateBatch.checkUser(user).catch((e) => console.log(e));

         const record = await odbc.processAnalyte(item, reqs[k+1], type, req, suffix);

         return ({
             analyte: newAnalyte,
             req: req,
             type: type,
             batchId: batchId,
             seq: seq,
             record: record,
             record1: item,
             record2: reqs[k+1],
             userId: dbUser.row_id,
             rowId: rowId,
             fileId: fileId,
             user: user,
             file: file
         });
       }
     }

 });


  Promise.all(results).then((completed) => {
      console.log("results");

      return completed;
  });

1 个答案:

答案 0 :(得分:0)

在这种情况下,filter将始终收到诺言,这是真实的价值观。选项是使用Promise.all,然后按索引过滤。使用for of

Promise.all(reqs.map(async (item, k) => {
     // make your requests
     // return true or false
})).then((results) => {
     const filteredReqs = reqs.filter((item, index) => results[index]);
});

更新: 有点误解了您的代码,您需要将filter替换为map。然后在Promise.all(results).then(....)

内进行过滤