这个不太好理解,请观看blue的视频
这里需要一个封装好的库
module.exports=runner;
// runner.js yield-runner-blue
function 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'})
}
// ...
})