2016-04-14 4 views
0

У меня есть массив для загрузки данных, и я хочу, чтобы они отправляли сервер поочередно. Я хочу, чтобы предыдущий завершил, прежде чем отправить следующий. Собственно, после каждого ответа я хочу решить, следует ли отправлять следующий или нет.AJAX вызов в цикле массива, вызов следующего только после предыдущего завершения

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 является асинхронным, и вы должны использовать его в асинхронном режиме. Если вы хотите сохранить некоторый порядок обработки, вам не следует бороться с AJAX, чтобы сделать это, а скорее реализовать эту логическую серверную сторону и отправить весь массив по одному запросу ... – MarioDS

ответ

1

Вы можете использовать рекурсивную функцию и поставить рекурсивный вызов внутри затем:

(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

, но как бы он обеспечил, он срабатывает следующим образом завершение предыдущего – Ahmad

+0

Он выполнит функцию, когда будет разрешено обещание. второй вызов цикла всегда будет выполняться при разрешении первого обещания. – jcubic