Javascript 在完成循环之前,承诺得到解决

Javascript 在完成循环之前,承诺得到解决,javascript,angularjs,ionic-framework,Javascript,Angularjs,Ionic Framework,我正在使用一个循环将数据更新到服务器,一旦收到服务器的响应,它就会在我的本地数据库中更新。但是在本地数据库中完成所有更新之前,承诺得到解决,并且只有一个数据得到更新。有谁能告诉我,为什么在完成for循环中的所有过程之前,承诺会得到解决 function updatecategories (data, categoryname) { var defer = $q.defer(); var proms = []; var prom; $log.log('Change in daybo

我正在使用一个循环将数据更新到服务器,一旦收到服务器的响应,它就会在我的本地数据库中更新。但是在本地数据库中完成所有更新之前,承诺得到解决,并且只有一个数据得到更新。有谁能告诉我,为什么在完成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;
}
函数更新类别(数据、类别名称){
var defer=$q.defer();
var-proms=[];
var-prom;
$log.log('daybook中的更改被调用',数据);
$log.log('daybook中的更改被调用',categoryname);
对于(变量i=0;i
首先,请添加
控制台日志(proms.length)在这一行之前:
$q.all(proms)。然后(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)时
line,
proms
将是一个充满未解决承诺的数组,其中
$q.all
将等待所有承诺得到解决,然后
defer.promise
也将得到解决。

for循环也将首先完成。然后i是data.length,可能只有最后一个承诺得到解决。如下图所示,您希望h承诺本身而不是承诺结果。为什么要等待
proms
完成?其中没有应该解决的问题,而且您是异步填充的,您应该将其中的save语句推送到它以等待初始proms。长度为0,所以我像上面提到的那样更改了代码当时我可以看到proms.length为11,但只有一个数据得到更新,然后承诺就结束了。