2015-11-10 12 views
6

Tình huống là tôi đang tải động một tập hợp các tập lệnh từ API mà sau đó tôi gọi qua eval(). Tôi không quan tâm thứ tự các tập lệnh được gọi, nhưng tôi không muốn bất kỳ lệnh nào được gọi cùng một lúc. Tức là, các kịch bản A, B và C có thể được trả về theo thứ tự C, B, A và tôi muốn bắt đầu eval(C) ngay lập tức khi C được trả lại, nhưng tôi muốn eval(B) đợi đến khi hoàn thành eval(C).Thực thi tập lệnh được trả về từ .each() một cách đồng bộ, nhưng không chậm trễ theo thứ tự hoàn thành

Không nhận được mã đầy đủ lông, đây là trái tim của nó trong đó "trường hợp" là một mảng chuỗi.

$.each(instances, function(index, instance) { 
    var apiUrl = "http://the-api-url.com/" + instance; 
    $.getJSON(apiUrl, function(data) { 
     // except I don't want to eval here as evaluations may overlap 
     eval(data.script); 
    }); 
}); 

Từ những gì tôi hiểu, tôi có thể sử dụng .when() đợi cho đến khi tất cả đã hoàn tất, nhưng điều đó sẽ lãng phí thời gian như tôi không cần phải đợi cho đến khi tất cả được tải xuống để bắt đầu thực hiện của họ.

+1

Đọc về Lời hứa trong ES5. – Niloct

+1

Nếu bạn đang nói rằng chúng có thể được tải xuống và được thực thi theo bất kỳ thứ tự nào, nhưng các lệnh gọi đến 'eval() 'không thể' chồng lên nhau 'thì bạn đã viết mã đó. –

+0

Bạn có đang đánh giá bất kỳ hoạt động không đồng bộ nào không? Nếu không, tôi không thấy bất kỳ vấn đề nào trong logic của bạn –

Trả lời

9

Đó là một chút không rõ ràng từ câu hỏi của bạn, nhưng giả định rằng các kịch bản có thể được thực hiện trong bất kỳ thứ tự (A, B, C, A, C, B, B, A, C, vv) sau đó bạn không cần phải thay đổi bất cứ điều gì.

Javascript (trong trình duyệt) là một chuỗi duy nhất, vì vậy các cuộc gọi lại bạn đang chuyển đến $.getJSON sẽ được lập lịch biểu theo thời gian.

+0

Đã thêm _ (trong trình duyệt) _ bởi vì tôi tin rằng có một số môi trường (nút?) Nơi bạn có thể làm những việc song song nhưng tôi có thể sai về điều đó. –

+0

Ngay cả trong trình duyệt, bạn có thể chạy webworkers với một số hạn chế nhưng ... Tôi nghĩ câu trả lời của bạn là đủ :) –

+0

Cảm ơn! Đây là một cứu trợ. –

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