好的,我需要一些Node中的生成器帮助。
我真的想编写看起来像这样的代码:
require('./Class.js');
fs = require('fs');
var Directory = Class.extend({
construct: function(path){
this.path = path;
},
list: function*() {
var files = [];
yield fs.readdir(this.path, function(error, directoryFiles) {
files = directoryFiles;
});
return files;
},
});
var directory = new Directory('C:\\');
var list = directory.list();
console.log(list); // An array of files
注意:
这样的事情可能吗?
答案 0 :(得分:2)
您可以使用promises执行此操作,以便您具有正确的异步处理以及对任何错误的内置支持。
list: function() {
var deferred = q.defer();
fs.readdir(this.path, deferred.makeNodeResolver());
return deferred.promise;
}
directory.list()
.then(function(files) { console.log(files); })
.fail(function(err) { res.send(500,err); });
答案 1 :(得分:2)
您可以使用Wait.for-ES6之类的帮助库(我是作者)
使用wait.for你的"列表"函数将是标准异步函数:
...
list: function(callback) {
fs.readdir(this.path, callback);
},
...
但如果您在生成器中,则可以按顺序调用它:
function* sequentialTask(){
var directory = new Directory('C:\\');
var list = yield wait.forMethod(directory,'list');
console.log(list); // An array of files
}
wait.launchFiber(sequentialTask);
优点:您可以按顺序调用任何标准的async node.js函数
缺点:您只能在生成器function*
另一个例子:你甚至可以在没有'列表的情况下做到这一点。自fs.readdir
以来的函数是标准async node.js函数
var wait=require('wait.for-es6'), fs=require('fs');
function* sequentialTask(){
var list = yield wait.for(fs.readdir,'C:\\');
console.log(list); // An array of files
}
wait.launchFiber(sequentialTask);