需求场景大概就是:调用的方法是异步的。需要遍历参数,循环调用这个方法。拿到所有方法执行的结果,才能进行下一步。
所以说,需要在循环里面执行异步方法,然后正确拿到所有结果。
刚面临这个问题的时候我是拒绝的,对于我这个还没出新手村的菜鸟来说,异步,还循环,离谱,总不能callback一层一层套进去吧。
然后我想到了递归,但是有风险,递归不好处理异常,挂一个倒一片。
最终选择的处理方式是:promise和promise.all()。
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()方法哦。