这个不太好理解,请观看blue的视频

这里需要一个封装好的库

  1. module.exports=runner;
  2. // runner.js yield-runner-blue
  3. function runner(_gen){
  4. return new Promise((resolve, reject)=>{
  5. var gen=_gen();
  6. _next();
  7. function _next(_last_res){
  8. var res=gen.next(_last_res);
  9. if(!res.done){
  10. var obj=res.value;
  11. if(obj instanceof Promise){
  12. obj.then((res)=>{
  13. _next(res);
  14. }, (err)=>{
  15. reject(err);
  16. });
  17. }else if(typeof obj=='function'){
  18. if(obj.constructor.toString().startsWith('function GeneratorFunction()')){
  19. runner(obj).then(res=>_next(res), reject);
  20. }else{
  21. _next(obj());
  22. }
  23. }else{
  24. _next(obj);
  25. }
  26. }else{
  27. resolve(res.value);
  28. }
  29. }
  30. });
  31. };

runner.js的用法

  1. //普通异步,只需要同时请求,数据之间没有依赖关系
  2. runner(function *(){
  3. let data1 = yield $.ajax({url:'data/1.txt', dataType: 'json'})
  4. let data2 = yield $.ajax({url:'data/2.txt', dataType: 'json'})
  5. let data3 = yield $.ajax({url:'data/3.txt', dataType: 'json'})
  6. console.log(data1, data2, data3)
  7. })
  8. //带逻辑的异步回调, 就是依赖上一次的结果
  9. runner(function *(){
  10. let userData = yield $.ajax({url:'getUserdatga', dataType: 'json'})
  11. if(userData.type == 'VIP'){
  12. let items = yield $.ajax({url:'getVipItems', dataType: 'json'})
  13. }else{
  14. let items = yield $.ajax({url:'getItems', dataType: 'json'})
  15. }
  16. // ...
  17. })