2015-06-06 13 views
5

Tôi có một chuỗi các chuỗi trong JavaScript. Mảng được định nghĩa như sau:Mảng JavaScript có chức năng không đồng bộ

var myArray = []; 
myArray.push('1'); 
myArray.push('2'); 
myArray.push('3'); 

Tôi cần lặp qua mảng và gọi hàm chạy không đồng bộ. Chức năng đó trông giống như sau:

function myAsyncFunction(id, callback) { 
    $.ajax({ 
    url: '/api/items', 
    data: { 'id':id }, 
    type: 'POST', 
    dataType: 'text', 
    success: function(result) { 
     if (callback) { 
     callback(); 
     } 
    }, error: function() { 
     if (callback) { 
     callback(); 
     } 
    } 
} 

Tôi đang cố gắng lặp qua tất cả các mục trong mảng của mình và tìm hiểu xem phải mất bao lâu để chạy tất cả các mục đó. Tôi muốn làm một cái gì đó như thế này:

var startTime = new Date(); 
for (var i=0; i<myArray.length; i++) { 
    myAsyncFunction(myArray[i]); 
} 
var duration = new Date() - startTime; 

Rõ ràng, ở trên không hoạt động bởi vì nó không chờ đợi cuộc gọi ajax để kết thúc trước khi chuyển sang mục tiếp theo trong mảng. Tôi biết tôi cần phải sử dụng callbacks. Tuy nhiên, tôi không chắc chắn làm thế nào để cấu trúc mã của tôi theo cách đó. Làm thế nào để tôi làm điều này?

+0

Nếu không có câu trả lời làm việc hoặc bạn đang phải đối mặt với vấn đề này, cho tôi biết để tôi có thể giúp – AmmarCSE

Trả lời

2

Sử dụng Promise và làm điều gì đó như thế này:

var myArray = [1, 2, 3]; 
var promises = []; 
var startTime = new Date(); 
var duration; 

for (var i = 0, len = myArray.length; i < len; i++) { 
    var def = $.Deferred(); 
    promises.push(def); 

    (function(i) { 
     $.ajax({ 
      url: '/api/items', 
      data: { 'id':myArray[i] }, 
      type: 'POST', 
      dataType: 'text' 
     }).done(function() { 
      promises[i].resolve(); 
     }); 
    })(i); 
} 

$.when.apply($, promises).done(function() { 
    duration = new Date() - startTime; 
    console.log(duration); 
}); 

tôi đã không kiểm tra, nhưng tôi nghĩ rằng nó có thể làm việc tốt với một số thích ứng :)
Tôi nghĩ rằng giải pháp với các truy cập có thể thất bại trong điều kiện nhất định.

EDIT: nó hoạt động http://jsfiddle.net/0u21jwxv/

1

theo dõi bao nhiêu cuộc gọi bạn sẽ làm

var callCount = myArray.length; 

Sau đó, trong callbacks kiểm tra xem nó cuối cùng một

success: function(result) { 
     callCount--; 
     if(callCount == 0){ 
      var duration = new Date() - startTime; 
     } 
} 
1

Hãy thử sử dụng một counter cho mục đích này. Khi giá trị bộ đếm là 0, hãy tìm thời lượng .

var startTime = new Date(); 
var counter = myArray.length; //COUNTER 
for (var i=0; i<myArray.length; i++) { 
    myAsyncFunction(myArray[i],function(){//Here you use the callback 
    counter--; 
    if(counter == 0){ 
    var duration = new Date() - startTime; 
    } 
    }); 
} 
Các vấn đề liên quan