当 async/await 遇上 forEach

js遍历数组常用基本就是 map,reduce,forEach,for...of

  • map 针对是返回值处理情况,关于忽略操作不友好,建议使用reduce
  • reduce 不仅仅是官方文档示例,求和的语法。常用就是数组累加,对象属性累加,可友好处理返回值
  • forEach 可友好处理map的忽略问题,return false 相当于 break 效果,跳出循环,return true 相当于 continue。对于累加建议使用 reduce,无需再定义一个新的对象
  • for...of 是 for...in 的优化版本,比直接 for 循环操作集合友好一些
return row[prop].reduce((acc, cur, idx) => {
  acc.push({key: row[`${prop}_id`][idx], label: cur });
  return acc;
}, []);

关于和 async/await 结合,测试发现,除了 for...of 外,其余都是异步执行【map 未测试】,即在循环内若使用await,在循环外是不能同步拿到解析的值,reduce第二次直接返回一个 pending 状态的 Promise

// NOTE: 当 async/await 遇上 forEach
const res = [];
for (let val of condition) {
  multiple.val = val;
  const resList = await _queryFormOrProcess(
    ctx,
    { formId, conditions, compId_tip },
    { isForm, errMsg }
  );
  // 以第一条查询为主数据, 合并明细
  if (!res.length) {
    res.push(...resList);
  } else {
    res[0].formData[compId_detail_src].push(
      ...resList[0].formData[compId_detail_src]
    );
  }
}
return res;

for-of 可以遍历各种集合对象的属性值,要求被遍历的对象需要实现迭代器 (iterator) 方法,例如 myObjectSymbol.iterator 用于告知 JS 引擎如何遍历该对象。一个拥有 Symbol.iterator 方法的对象被认为是可遍历的。

你可能感兴趣的:(当 async/await 遇上 forEach)