完成循环承诺之前得到解决
问题描述:
我正在使用一个循环来更新数据到服务器,一旦收到来自服务器的响应,它会在我的本地数据库中更新。但在完成本地数据库中的所有更新之前,解决,只有一个数据得到更新。任何人都可以告诉我为什么在完成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;
}
答
首先,能否请您此行前添加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,但只有一个数据被更新,然后承诺被关闭。 –
另外https://*.com/questions/750486/javascript-closure-inside-loops-simple-practical-example –
for循环将首先完成。那时我是data.length,可能只有最后一个承诺得到解决。因此,如下所示,您希望将承诺本身推向数组,而不是承诺结果。 – Shilly
你为什么要等'proms'完成?没有什么应该解决的,而且你填充它是不同步的,你应该在其中推入保存语句来等待 – Icepickle