2016-04-13 1 views
0

Dans le code ci-dessous, je veux l'exécution séquentielle de la méthode saveBulkUploadSinglePacket dans la boucle while, ce qui signifie traiter le paquet suivant après l'achèvement du paquet courant. Comment y parvenirexécution séquentielle de 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(); 

    } 

Répondre

1

La méthode standard pour dire « exécuter x lorsque la promesse est faite » est par promise.then(). Gardez une trace de la promesse en cours dans un var en dehors de la boucle et attacher chaque appel à la promesse précédente avec un .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; 
} 

A la fin de la fonction, je résolus de la promesse finale avec la valeur de retour souhaité, puis retourné la promesse. De cette façon, vous pouvez appeler saveBulUploadSinglePacket().then(...) pour attendre toutes les promesses de compléter et gérer le résultat.

+0

il se plaint lastPromise.resolve n'est pas une fonction . – Ahmad

+0

oublié d'enregistrer les promesses séquentielles dans le 'lastPromise' var; essayez le code mis à jour –

+0

ne fonctionne pas :(.. – Ahmad

0

Pour enregistrer votre pakets séquentielle, utilisez Array.prototype.reduce() pour construire une chaîne .then() très concise, comme suit:

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

Et appeler comme ceci:

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