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