javascript - q.allSettled 有默认超时吗?

标签 javascript node.js

我正在开发一个 NodeJS 应用程序,它从不同的 API 获取大量信息。

在最大的抓取过程中,我的 promise 出现了一些问题。

我想我发起的请求太多而且速度太快......

 var promises = [];
 list_consumptions.forEach(function (item)
 {
   item.consumptions.forEach(function (data)
   {
    promises.push(getDetails(item.line, data));
   });
 });

在 getDetails() 中

function getDetails(line, item)
{
  var deferred = Q.defer();
  var result = [];
    ovh.request('GET', '/telephony/*******/service/' + line + '/voiceConsumption/' + item, function (err, fetched_data)
    {
      if (!err)
      {
        result = {
          'line': line,
          'consumption_id': item,
          'type': fetched_data.wayType,
          'calling': fetched_data.calling,
          'called': fetched_data.called,
          'plan_type': fetched_data.planType,
          'destination_type': fetched_data.destinationType,
          'date': fetched_data.creationDatetime,
          'duration': fetched_data.duration,
          'price': fetched_data.priceWithoutTax
        };
        // console.log("RESULT: ",result);
        deferred.resolve(result);
      }
      else
      {
        deferred.reject(err);
        console.log(err);
      }
    });
    return deferred.promise;
}

循环之后:

Q.allSettled(promises).done(function(final_result)
  {
    final_result.forEach(function (promise_fetch){
      if (promise_fetch.state != 'fulfilled')
      {
        console.log("ERREUR Merge");
      }
      else
      {
        all_consumptions.push(promise_fetch.value);
      }
      deferred.resolve(all_consumptions);
    });
    return deferred.promise;
  });

使用这段代码,我得到了专门的日志错误:400

我会尝试使用一些 setTimeOut 来减慢我的循环,在这种情况下,获取成功,但我的 q.allSettled 被跳过...我真的迷路了...

有什么想法可以改进我的 promise 句柄/循环句柄吗? 我很确定你已经知道了,但这是我学习 JS 和 NodeJS 的第一周。

非常感谢您的帮助...

最佳答案

您可以使用 promise 循环,如下所示:

function pwhile(condition, body) {
  var done = Q.defer();

  function loop() {
    if (!condition())
      return done.resolve();
    Q.when(body(), loop, done.reject);
  }

  Q.nextTick(loop);

  return done.promise;
}

然后,您的代码将是:

list_consumptions.forEach(function (item) {
  var i = 0;
  pwhile(function() { return i < item.consumptions.length; }, function() {
    i++;
    return getDetails(item.line, data)
      .then(function(res) {
        all_consumptions.push(res);
      })
      .catch(function(reason) {
        console.log("ERREUR Merge");
      });
  }).then(function() {
    // do something with all_consumptions here
  });
});

关于javascript - q.allSettled 有默认超时吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32827026/

相关文章:

javascript - 如何在不更改地址栏中的 URL 的情况下使用 react-router 更改组件?

javascript - 根据下拉框的选定值,我需要更改 laravel 5 中的另一个字段值?

javascript - 单击链接时如何关闭 Foundation 顶部栏菜单?

javascript - 用于音频嵌入的自定义静音按钮?

mysql - 在nodejs中插入查询

javascript - Node js中的同步函数调用

node.js - 如何从 Node js 回调返回

javascript - jQuery,形式上的变量数学

javascript - 外国时间到本地时间

javascript - 如何删除 Sails.js 中的文件?