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

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

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

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

或者干脆:

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

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

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

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

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

虽然使用.nfcall会更好。