我试图使用生成器执行异步操作(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' ]]
我的问题是:
答案 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(...);