【问题标题】:Using Generators in Node JS Inside of a Class在类的 Node JS 中使用生成器
【发布时间】:2014-04-23 04:11:45
【问题描述】:

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

注意事项:

这样的事情可能吗?

【问题讨论】:

标签: javascript node.js asynchronous generator yield


【解决方案1】:

你可以使用像 Wait.for-ES6 这样的辅助库(我是作者)

使用 wait.for 你的“列表”函数将是一个标准异步函数:

 ...
list: function(callback) {
        fs.readdir(this.path, callback);
    },
 ...

但如果你在 generator 中,你可以按顺序调用它:

function* sequentialTask(){
   var directory = new Directory('C:\\');
   var list = yield wait.forMethod(directory,'list');
   console.log(list); // An array of files
}

wait.launchFiber(sequentialTask);

优点:您可以按顺序调用任何标准异步 node.js 函数

缺点:您只能在生成器内进行操作function*

另一个例子:你甚至可以不使用'list'函数,因为fs.readdir是一个标准异步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);

【讨论】:

    【解决方案2】:

    您可以使用 Promise 来执行此操作,以便获得适当的异步处理以及对任何错误的内置支持。

    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); });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-24
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2020-06-01
      • 2019-09-23
      • 1970-01-01
      • 2013-08-22
      相关资源
      最近更新 更多