了解带有承诺,生成器和异步/等待的异步控制流

时间:2018-08-01 06:29:56

标签: javascript asynchronous promise async-await generator

我已经阅读了几篇stackoverflow帖子,博客文章和Nodejs Design Patterns书籍,以更好地了解异步控制流。现在,我很愿意编写常规的回调传递样式(CPS)代码。但是,我试图摆脱这种习惯并提高代码的可读性(或者避免使用“回调地狱”)。我的问题是,我似乎将PromiseGeneratorAsync/Await理解为单独的概念以及如何使用它们。但是,我不确定如何利用它们来转换CPS函数以使其没有嵌套。

为了帮助理解这一概念,我编写了以下代码段:

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}`);
})();

代码段运行,我得到了预期的结果。我的问题是:

  1. 这是“正确”的方法,还是这种过大的手段(承诺+生成器+异步/等待)?
  2. 这可以简单地实现吗?

如果可能的话,如果我指出一些能以一种易于理解的方式解释该场景和方法的资源,我将很高兴。

1 个答案:

答案 0 :(得分:0)

(async () => {

    let fileContent = await readFile(fileLocation, 'utf8');
    let fileStat = await readStat(fileLocation);

    console.log(`Content: ${fileContent}`);
    console.log(`Stats: ${fileStat}`);
})();

不需要发电机

生成器用于解释异步/等待的概念,因为它是两者的结合。 但是要使用async / await函数,您将不再需要它们