javascript : promise实现异步循环

需求场景大概就是:调用的方法是异步的。需要遍历参数,循环调用这个方法。拿到所有方法执行的结果,才能进行下一步。

所以说,需要在循环里面执行异步方法,然后正确拿到所有结果。

刚面临这个问题的时候我是拒绝的,对于我这个还没出新手村的菜鸟来说,异步,还循环,离谱,总不能callback一层一层套进去吧。

然后我想到了递归,但是有风险,递归不好处理异常,挂一个倒一片。

最终选择的处理方式是:promise和promise.all()。

promise 简单示例:
var promise = new Promise(function(resolve, reject) {
	// resolve()在方法执行完成时调用,告诉程序方法执行完了
	// reject()在方法执行异常时调用,告诉程序方法挂了
	...此处是一个异步方法
	if(异步方法执行成功){
		// 可以传参
		resolve(successData);
	}else if(异步方法执行失败){
		// 可以传参
		reject(failedData);
	}
});

promise.then(function(data){
	// 进入这个方法,意味着promise里面的方法执行完成,
	// promise的状态变成fulfilled或者rejected
	// data 就是resolve()或者reject传过来的参数
	console.log("异步方法执行完成...");
})

promise简单粗陋地解释,它就是一个对象,它的一生有三种状态:pending(进行中),fulfilled(执行成功),rejected(执行失败),并且三种状态互斥。

promise从诞生伊始处于Pending状态,调用resolve()方法可以使其变成fulfilled状态,调用reject()方法可以使其变成rejected状态。

fulfilled状态和rejected状态都能触发then()方法。

再通俗点说就是,在promise对象里写一段异步执行的代码,当这段代码执行完毕的时候,调用resolve()方法,调用resolve()方法,调用resolve()方法,那么就能触发then()方法。

then()方法是可以链式写下去的,但是需要在上一个then()方法里返回一个新的promise对象。

现在进入正题,怎么循环异步

核心方法就是:创造一个promise数组promiseArray,然后调用Promise.all(promiseArray).then(function(data){});

Promise.all会在整个promise数组里的promise执行完成以后,调用then()方法,并且返回所有promise的参数。

例子:

var promiseArray = [];
for(var i = 0;i<10;i++){
	promiseArray.push(new Promise(function(resolve,reject){
		console.log("创建了一个promise");
		...//一段异步代码
		if(异步执行成功){
			// 改变promise的状态,告诉程序这个promsie执行完成并执行成功了
			resolve(data);
		}else if(异步执行失败){
			// 改变promise的状态,告诉程序这个promsie执行失败了
			reject(data);
		}
	}));
}
Promise.all(promiseArray).then(data){
	console.log("所有promise执行完成");
	// 并且所有执行的结果都在data里面了,处理它们吧
}

promise 异步循环,能用,好用,感恩的心,感谢promise.

记得调resolve()方法哦。

javascript : promise实现异步循环

上一篇:JDK1.8 创建线程池有哪几种方式?


下一篇:数据结构于算法——排序算法-希尔排序