这个不太好理解,请观看blue的视频
这里需要一个封装好的库
module.exports=runner;// runner.js yield-runner-bluefunction runner(_gen){return new Promise((resolve, reject)=>{var gen=_gen();_next();function _next(_last_res){var res=gen.next(_last_res);if(!res.done){var obj=res.value;if(obj instanceof Promise){obj.then((res)=>{_next(res);}, (err)=>{reject(err);});}else if(typeof obj=='function'){if(obj.constructor.toString().startsWith('function GeneratorFunction()')){runner(obj).then(res=>_next(res), reject);}else{_next(obj());}}else{_next(obj);}}else{resolve(res.value);}}});};
runner.js的用法
//普通异步,只需要同时请求,数据之间没有依赖关系runner(function *(){let data1 = yield $.ajax({url:'data/1.txt', dataType: 'json'})let data2 = yield $.ajax({url:'data/2.txt', dataType: 'json'})let data3 = yield $.ajax({url:'data/3.txt', dataType: 'json'})console.log(data1, data2, data3)})//带逻辑的异步回调, 就是依赖上一次的结果runner(function *(){let userData = yield $.ajax({url:'getUserdatga', dataType: 'json'})if(userData.type == 'VIP'){let items = yield $.ajax({url:'getVipItems', dataType: 'json'})}else{let items = yield $.ajax({url:'getItems', dataType: 'json'})}// ...})
