【发布时间】:2019-01-08 15:14:56
【问题描述】:
为了更好地理解异步控制流,我阅读了几篇 stackoverflow 文章、博客文章和 Nodejs 设计模式书籍。现在,我可以轻松编写常规回调传递样式 (CPS) 代码。但是,我试图摆脱这种习惯并提高代码的可读性(或者,避免“回调地狱”)。我的问题是,我似乎将Promise、Generator 和Async/Await 理解为单独的概念以及如何使用它们。但是,我不确定如何利用它们将 CPS 函数转换为没有嵌套。
为了帮助理解这个概念,我写了以下sn-p:
const fs = require('fs');
const bluebird = require('bluebird');
const path = require('path');
// promisified fns
const readFile = bluebird.promisify(fs.readFile);
const readStat = bluebird.promisify(fs.stat);
function* tasks() {
let fileLocation = path.resolve(__dirname, 'package.json');
yield readFile(fileLocation, 'utf8');
yield readStat(fileLocation);
}
(async () => {
const taskRunner = tasks();
let fileContent = await taskRunner.next().value;
let fileStat = await taskRunner.next().value;
console.log(`Content: ${fileContent}`);
console.log(`Stats: ${fileStat}`);
})();
sn-p 运行,我得到了预期的结果。我的问题是:
- 这是“正确”的方法还是矫枉过正(promises + generators + async/await)?
- 这可以简单实现吗?
如果可能,我会很高兴有人指出一些以易于理解的方式解释场景和方法的资源。
【问题讨论】:
-
我认为那里不需要发电机。为什么不只是
await每个Promise? -
@CertainPerformance 我想我明白你的意思。我删除了生成器,输出符合我的预期。
标签: javascript asynchronous promise async-await generator