循环里的异步问题,串行,并行

//首先有一个异步的函数:
function sleep(arguments='') {
  return new Promise((resolve, reject) => {
  	//模拟请求
    setTimeout(() => {
      resolve(arguments)
    }, 1000)
  })
}

在有调 函数 的循环 里使用async awaite
列如:forEach,map , 合适并行 promise.all

**//并行**
promiseAll()
async function promiseAll() {
  let  arr=[1,2,3];
  let promiseArr = [];
  console.log('Start')
  arr.forEach(item => {
    promiseArr.push((async (item) => {
      await sleep(1)
      console.log(item)
    })(item))
  })
  await Promise.all(promiseArr)
  console.log('End')
}
// 		Start
   ...耗时
// 		1
// 		2
// 		3
// 		End

**并发操作**
promiseAll()
async function promiseAll() {
  const arr = [1,2,3];
  let promiseArr = [];
  console.log('Start')
  promiseArr.push( arr.map(async (item) => {
    //耗时操作
    const contents = await sleep(item)
    console.log(contents)
  }))
  await Promise.all(promiseArr);
  console.log('End')
}
// 		Start
   ...耗时
// 		1
// 		2
// 		3
// 		End

在无回掉函数循环中使用 async await
列如:for ,for in ,for of ;串行发送

const arr= [1, 2, 3];
const forLoop = async _ => {
  console.log('start');
  for (let index = 0; index < arr.length; index ++) {
    const fruit = arr[index];
    const numFruit = await sleep(fruit);
    console.log(numFruit);
  }
  console.log('End')
}
// 		start
   ...耗时
// 		1
// 		2
// 		3
// 		End
const arr= [1, 2, 3];
const forInLoop = async _ => {
  console.log('start');
  for (let index in arr) {
    const fruit = arr[index];
    const numFruit = await sleep(fruit);
    console.log(numFruit);
  }
  console.log('End')
}
// 		start
   ...耗时
// 		1
// 		2
// 		3
// 		End
const arr= [1, 2, 3];
const forInLoop = async _ => {
  console.log('start');
  for (let item of arr) {
    const numFruit = await sleep(item);
    console.log(numFruit);
  }
  console.log('End')
}
// 		start
   ...耗时
// 		1
// 		2
// 		3
// 		End


总结:在循环里的异步问题 总体来讲 可以用Promis.all 来解决

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值