使用Q将node.js fs.readFile设为承诺的操作

时间:2014-04-10 05:26:35

标签: node.js promise q

当我使用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之间有什么不同吗?

1 个答案:

答案 0 :(得分:3)

您可以使用Q.nfcall来调用已颁发的NodeJS功能。

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