node.js q未等待解决延迟承诺
关于在node.js中使用q模块使用延迟承诺,我有一些不理解的地方。下面是一个说明我的问题的设置node.js q未等待解决延迟承诺,node.js,promise,q,Node.js,Promise,Q,关于在node.js中使用q模块使用延迟承诺,我有一些不理解的地方。下面是一个说明我的问题的设置 var Q = require('q'); var http = require('http'); var url = 'http://www.genenames.org/cgi-bin/download?' + 'col=gd_hgnc_id&' + 'col=gd_pub_eg_id&' + 'status=Appro
var Q = require('q');
var http = require('http');
var url = 'http://www.genenames.org/cgi-bin/download?' +
'col=gd_hgnc_id&' +
'col=gd_pub_eg_id&' +
'status=Approved&' +
'status_opt=2&' +
'where=&' +
'order_by=gd_pub_eg_id&' +
'format=text&' +
'limit=&' +
'submit=submit';
httpGet = function (url) {
var deferred = Q.defer();
var body = "";
http.get(url, function(res) {
res.on('data', function(chunk) {
body += chunk;
});
res.on('end', function() {
// WE NEVER GET HERE ...
console.log(body);
deferred.resolve(body);
});
})
.on('error', function(err) {
console.log(err);
});
return deferred.promise;
};
var fetchData = function() {
var deferred = Q.defer();
httpGet(url)
.then(deferred.resolve())
.done();
return deferred.promise;
};
fetchData()
.then(function() {
console.log("I got here before data was downloaded!")
process.exit(0);
})
.catch(function(err) {
throw(err);
})
.done();
在fetchData中,在下载完httpGet()数据之前调用“.then”函数。我不明白为什么在调用deferred.resolved之前执行.then
如果我注释掉fetchData()中的deferred.resolve(),那么事情就会像我预期的那样工作,当然,程序会挂起,因为最终的承诺永远不会实现
有人能指出我哪里出错了吗?您正在调用延迟的
。请立即解决。相反,您希望将对该函数的引用传递给,然后传递给,如下所示:
.then(deferred.resolve)
您不应该在fetchData
函数中使用。为什么不返回httpGet(url)
?另外,.catch(函数(err){throw err})
完全不起作用,请删除它。谢谢。好的观点。我对代码进行了一些编辑以进行清理,尽管我留下了您提到的反模式,因为这是我在最初的困惑中犯下的错误——我把它作为一个警示故事留给其他人。