在类JS中使用Node JS中的生成器

时间:2014-03-17 19:03:12

标签: javascript node.js asynchronous generator yield

好的,我需要一些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

注意:

这样的事情可能吗?

2 个答案:

答案 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);