2016-04-13 6 views
0

sıralı yürütme Aşağıdaki kodda, while döngüsünde saveBulkUploadSinglePacket yönteminin sıralı yürütmesini istiyorum; bu, geçerli paketin tamamlanmasından sonra sonraki paketi işlemek anlamına gelir. Bunu nasıl başarabilirim.JQuery Defers

var saveBulkUploadSinglePacket = function(){ 
while (packetCount<=bulkUploadPackets.length){ 
      $.when(saveBulkUploadSinglePacket(modelToSave)).done(function(arguments){ 
       saveBulkUploadPackets.push(arguments); 
       packetCount++; 
      }); 

     } 
    return saveBulkUploadPackets; 

} 



var saveBulkUploadSinglePacket = function(modelToSave){ 
     var defer = $.Deferred(); 
     $.when(new SaveBulkUpload().save(modelToSave)).done(function(arguments){ 
      defer.resolve(arguments); 
     }).fail(function(errorObj){ 
      defer.reject(errorObj); 
     }); 

     return defer.promise(); 

    } 

cevap

1

"söz bittiğinde x gerçekleştirmek" demek standart yolu promise.then() geçer. döngünün dışındaki bir var mevcut sözünün takip edin ve bir .then() önceki sözünü her çağrıyı ekleyin: Ben istenen dönüş değeri ile son sözünü çözüldü fonksiyonunun sonunda

var saveBulkUploadSinglePacket = function(){ 
    var lastPromise = $.when(); 
    while (packetCount<=bulkUploadPackets.length){ 
     lastPromise = (
      lastPromise 
      .then(function(){ 
       // make sure saveBulkUploadSinglePacket returns a promise 
       return saveBulkUploadSinglePacket(modelToSave)); 
      }) 
      .then(function(){ 
       saveBulkUploadPackets.push(arguments); 
       packetCount++; 
       // return a resolved promise 
       return $.when(); 
      }) 
     ); 
    } 
    lastPromise.resolve(saveBulkUploadPackets); 
    return lastPromise; 
} 

ardından döndü söz. Bu şekilde, sonuçların tamamlanması ve ele alınması için tüm vaatlerin beklenmesi için saveBulUploadSinglePacket().then(...) numaralı telefonu arayabilirsiniz. o lastPromise.resolve şikayetçi

saveBulkUploadPackets(bulkUploadPackets).then(function(results) { 
    // All done. 
    // use/log the `results` array here. 
}); 
+0

bir işlev değil:

var saveBulkUploadPackets = function(packets) { return packets.reduce(function(promise, paket) { return promise.then(function(results) { return (new SaveBulkUpload()).save(paket).then(function(res) { return results.concat(res); }); }); }, $.when([])); } 

Ve böyle diyoruz: – Ahmad

+0

, "lastPromise" varlığındaki sıralı sözleri kaydetmeyi unuttu; –

+0

güncellenen kodu deneyin çalışmıyor :(.. – Ahmad

0

aşağıdaki gibi çok kısaca bir .then() zinciri oluşturmak üzere Array.prototype.reduce() kullanın sizin pakets sırayla kaydetmek için .