co和yield VS Promise.all

      在对老项目进行review思考时,promise 和 then使用的频率较多,但使用的不太优雅,而且往往各种嵌套,callback hell的阴影挥之不去。看看以下一个例子:

function readFile(path){
  return new Promise((resolve,reject) => {
    fs.readFile(path,(err,data) => {
      return err ? reject(err) : resolve(data);
    });
  });
}

function delayTime(delay,text){
  return new Promise((resolve,reject) => {
    setTimeout(()=>{
      resolve(text);
    },delay)
  });
}

两个方法,readFile读取文件方法 需 依赖 delayTime方法执行完毕返回值才能执行。并且同时调用两次delayTime 两次 readFile.

使用 Promise.all 解决

Promise.all([delayTime(2,'public/upload/test1.txt'),delayTime(1,'public/upload/test2.txt')]).then(array_y => {

  return Promise.all([readFile(array_y[0]),readFile(array_y[1])]);

}).then(file_contents => {
    console.log(file_contents[0].toString());
    console.log(file_contents[1].toString());
});

例子中有两个Promise.all  ,先执行 两次delayTime 得出结果,赋参给readFile ,最终得出结果

这种情况,显得Promise.all 嵌套 Promise.all 一样。


使用 co 和 yield 解决 会更 显优雅,整洁

co(function *() {
    let array_y = yield [delayTime(2,'public/upload/test1.txt'),delayTime(1,'public/upload/test2.txt')];
    let array_y2 = yield [readFile(array_y[0]),readFile(array_y[1])];
    return array_y2;
}).then(file_contents => {
    console.log(file_contents[0].toString());
    console.log(file_contents[1].toString());
});
以上语法是基于,ES6标准,在新一代ES7标准,使用asyn 和 await 更优雅,代码可读性更强

猜你喜欢

转载自blog.csdn.net/rcjjian/article/details/79827895
今日推荐