Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
node.js q未等待解决延迟承诺_Node.js_Promise_Q - Fatal编程技术网

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

关于在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=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})
完全不起作用,请删除它。谢谢。好的观点。我对代码进行了一些编辑以进行清理,尽管我留下了您提到的反模式,因为这是我在最初的困惑中犯下的错误——我把它作为一个警示故事留给其他人。