网上有不少相似的实现方式,但我也不太懂js啊,因此我专门用TS写了一遍。
循环执行Promise,每一次循环都是异步且等上一循环结束后再执行下一次循环。
TypeScript异步执行数组中的每一项,并在每一项执行完后才继续执行后面的代码。
用的ES2015。数组
这个写法有什么用处呢?若是是加载资源,通常都是同时加载,最后统计加载完成的个数,都是能并发就并发的。
想来想去,不知道这种依次异步的实现方式,用在哪里。promise
后来我想,这能够用来实现相似Rx的流的概念。我一系列操做步骤,不管同步异步,全放在循环里,能够大大优化代码并发
/**异步循环 */ function doLoop() { try { var result:Promise<any> = Promise.resolve(); //forEach写法 loopArr.forEach( function (factory) { result = result.then(factory); } ); // Promise.all写法 //Promise.all(loopArr.map( // function(factory) // { // result = result.then(factory); // } //)); result.then(logLoopResult); } catch(err) { console.log("loop failed"); } } /**循环结束后才会执行此方法 */ function logLoopResult() { console.log("do Loop end"); } var loopCount:number = 0; var maxCount:number = 3; var loopArr = [promiseFactry1, promiseFactry2, promiseFactry3]; function calllLoopPromise(reslove) { setTimeout( function () { //此处loopCount++只是为了看下效果,实际不须要计数 loopCount++; console.log(loopCount, maxCount); return reslove("loopCount"); } , 1000 ); } function promiseFactry1() { return new Promise(calllLoopPromise); } function promiseFactry2() { return new Promise(calllLoopPromise); } function promiseFactry3() { return new Promise(calllLoopPromise); }
归根结底,这种写法,适合须要处理批量promise的状况。
并非循环体内的内容异步执行了,而是用循环的形式,把多个promise用then方法链接起来。异步