forEach内部有异步函数,如何令forEach内部的异步都执行完再让程序继续执行?———promise.all()方法

问题描述

if (array.length > 0) {
	// array是一个数组 []
	let a = []
	array.forEach(drill => {
		// 调用异步函数convertor
		convertor.translate(drill) {
			// 对drill操作并返回一个值data
			a.push(data)
		}
	}
	// 想让foEach执行完以后,得到所有data数组a后,再往下对数组a进行操作
	handle (a) {
		//对数组a进行操作
	}
}

以上程序如果直接执行,由于forEach内部存在异步函数,函数handle对a进行操作的时候,a仍然是一个空数组,里面不存在任何数据。想让forEach函数循环完成后,数组a里面把array里面的元素都调用convertor异步函数完并把返回结果data全部push进a数组后,再让程序往下继续执行handle函数。

此时就需要用到promise函数,程序可以在forEach函数内部的异步函数convertor定义为一个promise对象。定义一个数组promiseArray用来接收所有的promise对象。利用Promise.all(promiseArray).then( (a) => { handle(a) { } } )代码跟改为如下:

if (array.length > 0) {
	// array是一个数组 []
	let promiseArray = []
	array.forEach(drill => {
		let p = new Promise((resolve, reject) => {
			// 将异步函数convertor定义在promise里面
			convertor.translate(drill) {
			// 对drill操作并返回一个值data
			resolve(data)
			}
		})
		promiseArray.push(p)
	}
	// 想让foEach执行完以后,得到所有data数组a后,再往下对数组a进行操作
	// 这里的返回结果res也是一个resolve数据的数组 [data1,data2...]
	Promise.all(promiseArray).then(res => {
		handle (res) {
		//对数组res进行操作
		}
	})
	
}

Promise的all方法提供了并行执行异步操作的能力,并且在所有异步操作执行完后才执行回调。可以将多个 Promise 实例,包装成一个新的 Promise 实例。

const p = Promise.all([p1, p2, p3]);

p的状态由p1、p2、p3决定,分成两种情况。

  • 只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
  • 只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值