2016-04-13 4 views
0

В приведенном ниже коде я хочу выполнить последовательный запуск метода saveBulkUploadSinglePacket в цикле while, что означает следующий пакет процесса после завершения текущего пакета. Как это достичь.последовательное выполнение 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(); 

    } 

ответ

1

Стандартный способ сказать «выполнить х, когда обещание сделано» через promise.then(). Следите за текущее обещание в варе вне цикла и подключить каждый вызов к предыдущему обещанию с .then():

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

В конце функции я решил окончательное обещание с требуемым значением возврата, а затем вернулся обещание. Таким образом вы можете позвонить по номеру saveBulUploadSinglePacket().then(...), чтобы дождаться выполнения всех обещаний и обработать результат.

+0

он жалуется lastPromise.resolve не является функцией , – Ahmad

+0

забыл сохранить последовательные обещания в 'lastPromise' var; попробуйте обновленный код –

+0

не работает :(.. – Ahmad

0

Чтобы сохранить pakets последовательно использовать Array.prototype.reduce() построить .then() цепь очень сжато, следующим образом:

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([])); 
} 

И называют так:

saveBulkUploadPackets(bulkUploadPackets).then(function(results) { 
    // All done. 
    // use/log the `results` array here. 
}); 
Смежные вопросы