当前位置: 代码迷 >> 综合 >> co和yield VS Promise.all
  详细解决方案

co和yield VS Promise.all

热度:65   发布时间:2023-12-10 17:04:24.0

      在对老项目进行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 更优雅,代码可读性更强