关于javascript:在完成循环之前,承诺得到解决

Before completing the loop promise gets resolved

本问题已经有最佳答案,请猛点这里访问。

我正在使用循环来更新数据到服务器,一旦收到服务器的响应,它就会在我的本地db.But中更新,然后在本地数据库中完成所有更新之前,promise将得到解决,只有一个数据得到更新。 任何人都可以告诉我为什么在完成for循环中的所有进程之前解析了promise?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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;
}


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

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

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

1
2
3
4
5
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将是一个充满未解决的promise的数组,$q.all将等待所有解析,然后defer.promise也会解析。