关于javascript:使用Generator函数实现异步任务队列

43次阅读

共计 876 个字符,预计需要花费 3 分钟才能阅读完成。

var genAsyncTask2 = (val, time) => {return () => {return new Promise(function (resolve, reject) {let timer = setTimeout(() => {clearTimeout(timer);
            resolve(val);
          }, time);
        });
      }
    }
  
    // 工作队列
    var taskArr = [genAsyncTask2('第 1 个异步工作,工夫为 2 秒', 2000), genAsyncTask2('第 2 个异步工作,工夫为 1 秒', 1000),
      genAsyncTask2('第 3 个异步工作,工夫为 0.8 秒', 800), genAsyncTask2('第 4 个异步工作,工夫为 2.5 秒', 2500)
    ];
  
  
    function *genFun(taskArr){for(let i = 0 , len = taskArr.length; i < len; i++){yield taskArr[i]().then(res => {console.log('genSync', res);
          return res;
        });
      }
    }
  
    /**
     * 主动执行 generate 函数的 next,并保障执行程序
     * @param generateFn generate 函数
     * @param params 执行 generate 函数所需参数
     */
    function generateAutoExec(generateFn, ...params) {var g = generateFn(...params);
  
      var next = function (res) {if (res.done || typeof res.value == 'undefined') return res.value;
        res.value.then((data) => {console.log('data', data);
          next(g.next(data));
        }).catch((err) => {console.error(err);
          next(g.throw(err));
        });
      }
  
      next(g.next());
    }
  
    generateAutoExec(genFun, taskArr);

正文完
 0