需求场景大概就是:调用的方法是异步的。需要遍历参数,循环调用这个方法。拿到所有方法执行的结果,才能进行下一步。
所以说,需要在循环里面执行异步方法,然后正确拿到所有结果。
刚面临这个问题的时候我是拒绝的,对于我这个还没出新手村的菜鸟来说,异步,还循环,离谱,总不能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()方法哦。