Javascript 发电机和承诺-尝试组合

Javascript 发电机和承诺-尝试组合,javascript,asynchronous,promise,generator,es6-promise,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(); 它可以

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

据我所知,对于异步操作,将生成器与承诺相结合更好(信任问题)。这是真的,还是我误解了

因此,我试图将承诺与发电机结合起来。我用了凯尔·辛普森的

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

我的问题是:

  • 为什么这里的结果不同?空值从哪里来?我怎样才能摆脱它呢
  • 将承诺和生成器结合在一起有意义吗

  • 对不起,你们为什么需要发电机呢?为什么不使用异步/等待

    大概是这样的:

    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在评论中所建议的,您可以简单地使用:

    const fs = require('fs');
    const {promisify} = require('util');
    
    const readDirectory = promisify(fs.readdir);
    
    readDirectory("someDir").then(...);
    

    async
    函数中删除
    wait
    ,它是完全冗余的。是的,最后我将两者都删除了。请参阅第二个清单。如果要删除所有冗余,那么最好只执行
    const readDirectory=promisify(fs.readdir)
    Right!:)唯一的问题是我想问题中的代码可能是一些更复杂代码的一部分。所以在最初更复杂的代码中,作者可能需要带参数的专用函数和异步/等待。2015年就是这样。这是一个使用ES6的黑客。今天,您应该使用
    async
    /
    await
    语法。
    const fs = require('fs');
    const {promisify} = require('util');
    
    const readDirectory = promisify(fs.readdir);
    
    readDirectory("someDir").then(...);