2016-04-14 29 views
0

Verileri yüklemek için bir dizim var ve onların sunucuya tek tek göndermelerini istiyorum. Bir öncekini göndermeden önce bir öncekinin bitmesini istiyorum. Aslında, her cevaptan sonra bir sonraki mesajın gönderilip gönderilmeyeceğine karar vermek istiyorum.Dizi döngüsünde AJAX çağrısı, yalnızca önceki tamamlandıktan sonra çağrı yap

while (packetCount < bulkUploadPackets.length) { 
    d = d.then(save(bulkUploadPackets[packetCount])) 
    .then(function(uploadResponse) { 
     //I want to come here after first call complete 
     //before second call is fired and so on 
     packetCount++; 
    }); 
} 


save: function(modelToSave) { 
    var defer = $.Deferred(); 
    var self = this; 
    this.model = modelToSave; 
    Backbone.sync('create', this, { 
    success: function(data, textStatus, jqXHR) { 
     console.log("success" + data); 
     defer.resolve(data); 
    }, 
    error: function(response) { 
     defer.reject(errorObj); 
    } 
    }); 

    return defer.promise(); 
} 
+0

AJAX asenkron olur ve uyumsuz kullanmak gerekir. Eğer bir işlem sırasını korumak istiyorsanız, bunu yapmak için AJAX ile savaşmamalısınız, daha ziyade bu mantık sunucu tarafını uygulayın ve tüm diziyi tek bir isteğinize gönderin ... – MarioDS

cevap

1

Sen özyinelemeli işlevini kullanın ve sonra içine özyinelemeli çağrı koyabilirsiniz:

(function loop() { 
    if (packetCount<bulkUploadPackets.length) { 
      d = d.then(save(bulkUploadPackets[packetCount])) 
       .then(function(uploadResponse){ 
         //I want to come here after first call complete before second call is fired and so on 
         packetCount++; 
         loop(); 
       }); 
    } 
})(); 
+0

ama nasıl olacağını garanti eder önceki bir – Ahmad

+0

tamamlandı Söz verdikten sonra işlevi yürütecektir. ilk sözü çözüldüğünde ikinci döngü çağrısı her zaman yürütülür. – jcubic