发电机和承诺 - 试图结合起来

时间:2017-11-23 19:02:29

标签: javascript asynchronous promise generator es6-promise

我试图使用生成器执行异步操作(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' ]

从我所学到的,对于异步操作,将生成器与promises相结合更好(信任问题)。这是真的吗,还是我误解了?

因此,我试图将promises与生成器结合起来。我使用了凯尔辛普森的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);

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

我的问题是:

  1. 为什么结果会有所不同? null来自何处?我怎么摆脱它?
  2. 在这里结合承诺和生成器是否有意义?

1 个答案:

答案 0 :(得分:1)

对不起,为什么你在这里需要发电机?为什么不使用async / await?

这样的事情:

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

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

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

即使没有异步/等待,您也可以这样做:

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

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

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

最后,正如@Patrick Roberts在评论中建议你可以简单地使用:

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

const readDirectory = promisify(fs.readdir);

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