2017-10-11 4 views
0

ループを使用してサーバーにデータを更新し、サーバーからの応答を受信すると、ローカルdbのすべての更新を完了する前にローカルデータベースで更新されます。解決され、1つのデータのみが更新されます。誰も私の周りのすべてのプロセスを完了する前に、約束がなぜ解決されるのか教えていただけますか?ループプロミスを完了する前に解決する

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'が完了するのを待っていますか?解決する必要があるものは何もありません。非同期でいっぱいですが、代わりにsave文をpushして – Icepickle

答えて

1

まず、あなたは、この行の前にconsole.log(proms.length);を追加してくださいすることができます:$q.all(proms).then(function() {

最初に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になるのを見ることができますが、1つのデータだけが更新され、約束が閉じられます。 –

関連する問題