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

//首先有一个异步的函数:
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 来解决

你可能感兴趣的:(js,js)