【问题标题】:Before completing the loop promise gets resolved [duplicate]在完成循环承诺之前得到解决[重复]
【发布时间】:2018-03-22 18:04:08
【问题描述】:

我正在使用循环将数据更新到服务器,一旦收到来自服务器的响应,它就会在我的本地数据库中更新。但是在完成本地数据库中的所有更新之前,承诺得到解决,只有一个数据得到更新.谁能告诉我为什么在 for 循环中完成所有过程之前承诺得到解决?

function updatecategories (data, categoryname) {
  var defer = $q.defer();
  var proms = [];
  var prom;
  $log.log('Change in daybook change got called', data);
  $log.log('Change in daybook change got called', categoryname);
  for (var i = 0; i < data.length; i++) {
    delete data[i].is_synced;
    data[i].category = categoryname;
    save(data[i]).then(function (result) {
      $log.log('values changed in daybook', result);
      proms.push('success');//only one data is getting synced to server rest is not by nid on 10-10
    }, function (err) {
      $log.log('error in update to daybook', err);
    });
  }
  $q.all(proms).then(function () {
    defer.resolve('success');
  });
  return defer.promise;
}

【问题讨论】:

  • for 循环将首先完成。到那时 i 是 data.length 并且可能只有最后一个承诺得到解决。因此如下所示,您希望将 Promise 本身推送到数组而不是 Promise 结果。
  • 您为什么要等待proms 完成?里面没有什么可以解决的,你正在异步填充它,你应该把保存语句推到里面等待

标签: javascript angularjs ionic-framework


【解决方案1】:

首先,请您在此行之前添加console.log(proms.length);$q.all(proms).then(function () {

我猜它会打印 0,因为第一次将任何内容推送到 proms 数组时将异步发生,这意味着在解释器完成运行 updatecategories 函数之后。

如果确实如此,请考虑将其更改为类似的内容:

proms.push(save(data[i]).then(function (result) {
  $log.log('values changed in daybook', result);
}, function (err) {
  $log.log('error in update to daybook', err);
}));

然后,当您点击$q.all(proms) 行时,proms 将是一个充满未解决的承诺的数组,$q.all 将等待所有的解决,然后defer.promise 也将解决。

【讨论】:

  • 最初 proms.length 为 0,所以我更改了您上面提到的代码,当时我可以看到 proms.length 为 11,但只有一个数据被更新,然后 promise 被关闭.
猜你喜欢
  • 2015-07-18
  • 2018-01-21
  • 2015-06-24
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
  • 2018-04-28
  • 2020-04-09
相关资源
最近更新 更多