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