2016-08-03 18 views
6

Tôi có một mảng giá trị (myarray), mà tôi muốn lặp qua và chạy một yêu cầu AJAX trên mỗi lần lặp. Tôi đã đặt mỗi yêu cầu ajax bên trong một mảng (requests), vì vậy mà tôi có thể gọi một alert khi tất cả các yêu cầu AJAX đã hoàn thành:Thu thập kết quả AJAX theo thứ tự

Giống như vậy:

var requests = []; 
for (i = 0; i < myarray.length; ++i) { 
    requests.push($.ajax({ 
     url: 'anotherurl?=' + myarray[i], 
     dataType: "JSONP", 
     success: function (data) { 
      array_of_results.push(data); 
     } 
    })); 
} 
$.when.apply($, requests).done(function() { 
    alert('complete'); 
}); 

Tất cả các kết quả được thu thập trong array_of_results. Tuy nhiên do các yêu cầu AJAX lấy các khoảng thời gian khác nhau để hoàn thành, mảng này không có kết quả theo thứ tự ban đầu.

Có cách nào để đặt hàng mảng này không?

Tôi hy vọng tôi có ý nghĩa. Tôi đánh giá cao điều này khá phức tạp.

+1

cuộc gọi ajax trong vòng lặp for. Có cần thiết không? –

+0

Tốt nhất là nên thực hiện công việc này bằng cách sử dụng Lời hứa. Chẳng hạn như ánh xạ mảng của bạn thành một mảng hứa hẹn (nói 'myPromiseArray') và sau đó gọi' Promise.all (myPromiseArray) .then (onFulFillment, onReject) 'Ở đó các cuộc gọi lại' onFulfillment' và 'onReject' sẽ được cung cấp một mảng kết quả đến từ lời hứa theo thứ tự ban đầu. – Redu

+0

Asi hiểu cuộc gọi $ .ajax() trả về một đối tượng jqXHR vì V1.5 chứa tất cả các thuộc tính, phương thức và hành vi của giao diện Promise. Vì vậy, việc thực hiện những gì tôi đã đề cập trong bình luận trên phải là một phúc lạc. Để biết thêm thông tin về http://api.jquery.com/jquery.ajax/#jqXHR – Redu

Trả lời

7

Bạn đã thử những điều sau đây chưa? Tôi nghĩ rằng điều này sẽ làm việc. Tất cả các câu trả lời sẽ có sẵn, theo thứ tự, trong chức năng thành công của when().

var requests = []; 
for (i = 0; i < myarray.length; ++i) { 
    requests.push($.ajax({ 
     url: 'anotherurl?=' + myarray[i], 
     dataType: "JSONP" 
    })); 
} 
$.when.apply($, requests).done(function() { 
    array_of_results = arguments; 
    alert('complete'); 
}); 
+0

, nó bỏ lỡ việc đẩy dữ liệu vào array_of_results khi thành công (của mỗi cuộc gọi ajax) –

+0

Tôi đã sửa lại ví dụ của mình. Bạn cần sử dụng từ khóa JS "đối số" đặc biệt để lấy các tham số hàm thành công dưới dạng một mảng. –

+0

Ok .. nhưng thứ tự sẽ được nêu ra của cuộc gọi ajax trả lại không phải của số gọi –

0

Thay vì sử dụng vòng lặp xem xét sử dụng đệ quy. Dưới đây là ví dụ hoàn chỉnh:

var myArray = [ 
    "somevalue", 
    "some other value", 
    "another value" 
]; 
var i = myArray.length; 
var responses = []; 

function doRequests(){ 
    i--; 
    $.ajax({ 
     url: "myurl.php", 
     data: {paramname: myArray[i]} 
    }).done(function(response){ 
     responses.push(response); 
     if(i>0) doRequests(); 
     else{ 
      // all requests sent.. do stuff 
      // responses array is in order 
      console.log(responses); 
      alert("all done!"); 
     } 
    }); 
} 
-1

Cách sử dụng lệnh jquery.ajax với cài đặt không đồng bộ là sai. Bằng cách này, reaponse sẽ được theo thứ tự theo yêu cầu ...

+0

Nó sẽ treo lên trình duyệt và dừng quá trình khác :) –

+0

cũng, tôi khá chắc chắn nó không được chấp nhận. tôi cảm thấy như tôi thấy một tin nhắn trong giao diện điều khiển để có hiệu lực thời gian qua tôi đã cố gắng sjax .. –

-1

Dựa trên câu trả lời @ Christo của - sử dụng các mảng đồ chức năng

var array_of_results = []; 
var requests = myarray.map(function(item, index) { 
    return $.ajax({ 
     url: 'anotherurl?=' + item, 
     dataType: "JSONP", 
     success: function (data) { 
      array_of_results[index] = data; 
     } 
    } 
}); 

...

+0

lý do tại sao downvote?Đó là mã hoàn toàn tốt, chỉ vì Christo đã xóa câu trả lời của mình không làm cho câu trả lời này ít hợp lệ - hèn nhát ẩn danh downvote mà không cần giải thích –

1

Bạn có thể thêm một thuộc tính tùy chỉnh để $.ajax của bạn đối tượng, được đặt thành số i var.

var requests = []; 
for (i = 0; i < myarray.length; ++i) { 
    requests.push($.ajax({ 
     url: 'anotherurl?=' + myarray[i], 
     dataType: "JSONP", 
     myCustomIndex: i, 
     success: function (data) { 
      array_of_results[this.myCustomIndex] = data; 
     } 
    })); 
} 
$.when.apply($, requests).done(function() { 
    alert('complete'); 
}); 

JavaScript thực sự là sự hoán đổi, nếu bạn gán giá trị cho mảng ngoài giới hạn của nó (cao hơn 0), kích thước của mảng sẽ được tự động đặt thành số tiền phù hợp.

+0

Tôi nghĩ rằng giá trị "i" luôn là giá trị cuối cùng của chu trình "cho" (xem phần đóng ...) –

+1

Ho yeah! Bạn nói đúng, tôi chỉnh sửa mớ hỗn độn đó ngay bây giờ! –

Các vấn đề liên quan