繁体   English   中英

节点js没有解析承诺数组

[英]Node js not resolving array of promises

我正在尝试执行几个异步请求并尝试使用promises获取输出。

如果我有多个请求排队,Q.all(promises).then()函数似乎不起作用。 对于单个请求,承诺都已解决。 示例代码在这里。

var request = require('request');
var Q = require('q');

var sites = ['http://www.google.com', 'http://www.example.com', 'http://www.yahoo.com'];
// var sites = ['http://www.google.com']

var promises = [];

for (site in sites) {
  var deferred = Q.defer();
  promises.push(deferred.promise);
  options = {url: sites[site]};

  request(options, function (error, msg, body) {
    if (error) {
      deferred.reject();
    }

    deferred.resolve();
  });
}

Q.all(promises).then (function () {
  console.log('All Done');
});

我在这做错了什么?

苏里亚

这是我在场景中所做的,这是整个代码:

var Q = require('q');
var request = Q.nfbind(require('request'));

var sites = ['http://www.google.com', 'http://www.example.com', 'http://www.yahoo.com'];
var requests = sites.map(request); 

Q.all(requests).then(function(results){
   console.log("All done") // you can access the results of the requests here
});

现在为什么:

  • 始终在最低级别进行宣传,宣传请求本身,而不是特定请求。 喜欢自动宣传手动宣传,不要犯愚蠢的错误。
  • 处理集合时 - 使用.map比手动迭代它们更容易,因为我们在这里只为每个URL生成一个操作。

该解决方案也很短并且需要最少的嵌套。

不要使用for..in迭代数组。 这实际上做的是将site设置为0, 1, 2这只是不能很好地工作。 使用一些其他形式的迭代,如常规for循环或Array.prototype.forEach

sites.forEach(function (site) {                                                 
  var deferred = Q.defer();                                                     
  promises.push(deferred.promise);                                               
  options = {url: site};       

问题是你在for循环的每个滴答上都改变了deferred的值。 因此,在您的示例中实际解决的唯一承诺是最后一个。

要修复它,您应该在某些上下文中存储deferred的值。 最简单的方法是使用Array.prototype.forEach()方法而不是for循环:

sites.forEach(function (site){
  var deferred = Q.defer();
  var options = {url: sites[site]};
  promises.push(deferred.promise);

  request(options, function (error, msg, body) {
    if (error) {
      deferred.reject();
    }

    deferred.resolve();
  });
})

而你也错过了var声明options变量。 在JavaScript中,它表示声明全局变量(或node.js模块范围变量)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM