for循环中异步请求问题:循环里面使用异步函数,如何等所有的异步函数都执行完再进行下一步

4 篇文章 0 订阅

场景是这样的:

在一个列表循环里,对数据进行赋值,调用接口,循环外后面的代码需等待所有请求执行完成后再去执行。

1. Promise.all实现

Promise.all() 方法接收一个 promise 的 iterable 类型(注:Array,Map,Set 都属于 ES6 的 iterable 类型)的输入,并且只返回一个Promise实例,那个输入的所有 promise 的 resolve 回调的结果是一个数组。这个Promise的 resolve 回调执行是在所有输入的 promise 的 resolve 回调都结束,或者输入的 iterable 里没有 promise 了的时候。它的 reject 回调执行是,只要任何一个输入的 promise 的 reject 回调执行或者输入不合法的 promise 就会立即抛出错误,并且 reject 的是第一个抛出的错误信息。

伪代码如下
const pro = []
//一个列表循环
this.EarDataGrid.instance.getSelectedRowsData().forEach((item, index) => {
     // 取需要的数据
     const { BatchID, BatchName} = item
     let empty = {};
     empty['BatchID'] = BatchID //同步代码修改
     empty['BatchName'] = BatchName
     // 根据BatchID去请求xx接口,将请求合并用all请求
     pro.push(
         new Promise((res, rej) => {
             this.odataContext.bizBatchSetExpand.byKey(BatchID).then(r => {
                 res(r[0])
             })
         }))
     }
 });
 //根据刚刚push的all请求
Promise.all(pro).then((res) => {
	//在这就可以等所有的返回结果可以得到
	// do some thing...
 })
 

2. for await…of实现(推荐)

这种方法是es6新语法,其介绍如下:

for await…of 语句创建一个循环,该循环遍历异步可迭代对象以及同步可迭代对象,包括:内置的 String, Array,类似数组对象 (例如 arguments 或 NodeList),TypedArray, Map, Set 和用户定义的异步/同步迭代器。它使用对象的每个不同属性的值调用要执行的语句来调用自定义迭代钩子。
类似于 await 运算符一样,该语句只能在一个async function 内部使用。

  • for…of 针对可迭代对象身上的(array, map, set, string, typedarray, argements)
    迭代的是对象列表中的值(value) ,一般情况遍历数组

  • for…in 针对对象的属性进行无序遍历,除了symbol类的属性
    遍历的是属性,一般情况适用于对象遍历

该方法使用起来,相比Promise.all要简洁的多,十分好用

代码示例如下:

/**根据批次调健康管理接口 */
async handleHealthApi() {
  // 使用for await...of实现处理异步操作
  for await (let item of this.batchList) {
    let params = `?$filter=BatchID eq '${item.BatchId}'&$orderby=ImmunityDate`;
    let { value } = await immtipApi.ImmunityPromptBatch(params)
   	// do some thing...
  }
},

变量控制

这种方法不推荐,很不推荐,建议优先使用官方推出的语法,这种写法会产生没必要的if,维护起来会越来越麻烦。

list.forEach(function (item, i) {
    setTimeout(() => {
        //模拟异步回调中
        count++;
        console.log('执行请求ing');
        //执行完所有异步操作
        if (count === list.length) {
            console.log(' 请求执行完成✅',)
            // do some thing...
        }
    }, i)
})

写在最后

觉得有用 点个赞吧

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百事可口

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值