【问题标题】:make node.js fs.readFile as promised action using Q使用 Q 将 node.js fs.readFile 作为承诺的操作
【发布时间】:2014-04-10 18:03:24
【问题描述】:

当我使用deferred.resolve 方式承诺一个动作时,我无法获取文件的内容

function readFile(fileName) {
    var deferred = Q.defer();
    fs.readFile(fileName, 'utf-8', deferred.resolve);
    return deferred.promise;
};

readFile('test.txt').then(function (err, data) {
    console.log('data:' + data)
})

我得到data:undefined 输出

但是当我承诺采取行动httpGet时,它工作得很好

var httpGet = function (opts) {
    var deferred = Q.defer();
    http.get(opts, deferred.resolve);
    return deferred.promise;
};

httpGet('http://www.google.com').then(function (res) {
        console.log("Got response: " + res.statusCode);
        res.on('data', function (data) {
            console.log(data.toString());
        })
    }
);

上面的代码有问题吗?这样我怎样才能得到文件的内容。 还是 fs.readFile 和 http.get 之间有什么不同?

【问题讨论】:

标签: node.js promise q


【解决方案1】:

你可以使用Q.nfcall来调用一个NodeJS函数promisified。

function httpGet(opts){
    return Q.nfcall(http.get,opts);
}

或者简单地说:

var httpGet = Q.nfbind(http.get,http)

顺便说一句,这也适用于fs.readFile

如果您想手动操作。 Q 的延迟对象有一个.makeNodeResolver 函数,它可以让你像你一样安全地传递它们:

var httpGet = function (opts) {
    var deferred = Q.defer();
    http.get(opts, deferred.makeNodeResolver());
    return deferred.promise;
};

.makeNodeResolver 所做的其中一件事是绑定.this 值。

最好使用.nfcall

【讨论】:

  • 值得一提的是,像 Bluebird 这样的其他库在这里的速度要快几个数量级,因为它们使用动态重新编译等技术来创建一个(几乎)与回调版本一样快的承诺函数。
猜你喜欢
  • 2015-04-08
  • 2015-02-25
  • 2015-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 2012-11-03
  • 1970-01-01
相关资源
最近更新 更多