使用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
会更好。