【问题标题】:Generators and Promises - trying to combine生成器和承诺 - 试图结合
【发布时间】:2018-05-07 19:14:15
【问题描述】:

我正在尝试使用生成器来执行异步操作(readdir)并打印结果。

这是我的代码:

var dirname = //some directory name;
function *gen(done) {
    let exercises = yield fs.readdir(dirname, done);
    console.log(exercises);
}

let G = gen(function(err, res) {
    G.next(res);
})

G.next();

这工作并打印 ['README.md', 'sol.js']

据我所知,对于异步操作,将生成器与 Promise 结合起来会更好(信任问题)。这是真的吗,还是我误会了?

因此,我尝试将 Promise 与生成器结合起来。我用的是凯尔辛普森的Asynquence library

const fs = require('fs');
const ASQ = require('asynquence-contrib');

function readDirectory(dir) {
    return ASQ(function(done){
        fs.readdir(dir,done);
    });
}

function *genProm() {
    let exercises = yield readDirectory(dirname);
    console.log(exercises);
}

ASQ().runner(genProm);

现在,结果是 [空,['README.md','sol.js']]

我的问题是:

  1. 为什么这里的结果不同? null 来自哪里?我该如何摆脱它?
  2. 在这里结合 Promise 和生成器有意义吗?

【问题讨论】:

  • "我尝试将 Promise 与生成器结合使用" - 不要。这就是 2015 年。这是一个与 ES6 配合使用的 hack。今天你应该使用async/await 语法。

标签: javascript asynchronous promise generator es6-promise


【解决方案1】:

对不起,您为什么需要发电机?为什么不使用 async/await?

类似这样的:

const fs = require('fs');
const {promisify} = require('util');

const readDirectory = async dirname => await promisify(fs.readdir)(dirname);

readDirectory("someDir").then(...);

即使没有 async/await,您也可以这样做:

const fs = require('fs');
const {promisify} = require('util');

const readDirectory = dirname => promisify(fs.readdir)(dirname);

readDirectory("someDir").then(...);

最后正如@Patrick Roberts 在 cmets 中建议的那样,您可以简单地使用:

const fs = require('fs');
const {promisify} = require('util');

const readDirectory = promisify(fs.readdir);

readDirectory("someDir").then(...);

【讨论】:

  • async函数中去掉await,完全是多余的。
  • 是的,最后我都删除了。请参阅第二个清单。
  • 好吧,如果您要删除所有冗余,那么您不妨这样做const readDirectory = promisify(fs.readdir)
  • 对! :) 唯一的问题是我认为问题中的代码可能是一些更复杂代码的一部分。因此,在原始更复杂的代码中,作者可能需要带参数的专用函数和 async/await。
猜你喜欢
  • 2018-02-13
  • 2015-01-06
  • 1970-01-01
  • 2021-10-28
  • 2017-10-20
  • 2021-12-30
  • 2023-03-17
  • 2015-10-20
相关资源
最近更新 更多