2017-10-11 86 views
0

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

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; 
} 
+0

另外https://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example –

+0

for循环将首先完成。那时我是data.length,可能只有最后一个承诺得到解决。因此,如下所示,您希望将承诺本身推向数组,而不是承诺结果。 – Shilly

+0

你为什么要等'proms'完成?没有什么应该解决的,而且你填充它是不同步的,你应该在其中推入保存语句来等待 – Icepickle

回答

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也将解决。

+0

初始proms.length为0,所以我改变了代码,就像你在当时提到的那样可以看到proms.length为11,但只有一个数据被更新,然后承诺被关闭。 –