2013-05-09 22 views
11

Tôi có một thử nghiệm suy nghĩ. Trong mã của tôi, tôi có một biến toàn cầu nói var changeMe; và tôi đang thực hiện một số cuộc gọi Ajax.Ajax Javascript có thể dẫn đến deadlocks không?

//call One -- third param is the callback function 
    ajaxFunction(url1, params,function(data){ 
     changeMe = data; 
    }); 

//call Two 
    ajaxFunction(url2, params,function(data){ 
     changeMe = data; 
    }); 

Vì vậy changeMe giá trị sẽ phụ thuộc vào Ajax gọi kết thúc cuối cùng, có nghĩa là cuộc gọi mà kết thúc cuối cùng sẽ ghi đè lên giá trị.

Điều gì sẽ xảy ra nếu cả hai cuộc gọi kết thúc chính xác tại cùng một lúc, cùng một dấu thời gian?

Vì Javascript là đơn luồng, chúng tôi thường sẽ không gặp phải vấn đề này, nhưng điều này có thể phát sinh trong trường hợp các cuộc gọi setTimeout và Ajax. Tôi không biết làm thế nào tôi có thể tái tạo vấn đề này với độ chính xác, vì vậy nó vẫn là một thử nghiệm suy nghĩ.

Vậy làm thế nào trong điều kiện đa luồng là một bế tắc được xử lý?

Tôi thích một câu trả lời như changeMe sẽ url1 hoặc url2, và giải thích tình hình rõ ràng ..

Cảm ơn trước

+1

http://stackoverflow.com/questions/7575589/how-does-javascript-handle-ajax-responses-in-the-background/7575649#7575649 –

+1

Trong JavaScript, bạn chỉ có một chuỗi duy nhất để có không vấn đề gì. – erikkallen

+0

@Ishank ... thanks fr tht..but tôi đã không nhận được một ans đơn giản fr này ... – Sarath

Trả lời

13

Javascript có một hàng đợi sự kiện. Nó có nghĩa là nó xử lý TẤT CẢ các sự kiện (các sự kiện do người dùng kích hoạt, các sự kiện setTimeout, ajax trả về các sự kiện) từng sự kiện một, khi chúng đến.

Bạn không thể đưa ra giả định về thứ tự thực hiện, điều này chắc chắn không phải là cách phù hợp để thực hiện. Điều đó không có nghĩa là bạn không thể thực hiện đồng bộ hóa. Ví dụ:

function processURLs() { 
    var url1 = "http://www.url1.com/"; 
    var url2 = "http://www.url2.com/"; 
    var data1 = null; 
    var data2 = null; 

    ajaxFunction(url1, params, function(data){ 
     data1 = data; 
     if(data2 !== null) { 
      process(data1, data2); 
     } 
    }); 

    ajaxFunction(url2, params, function(data){ 
     data2 = data; 
     if(data1 !== null) { 
      process(data1, data2); 
     } 
    }); 
} 

Bạn nói rằng javascript là một chuỗi. Đúng rồi. Chủ đề đó giữ vòng lặp và bật các sự kiện từ hàng đợi này khi có sự kiện để xử lý.

Ngay cả khi các cuộc gọi kết thúc chính xác cùng một lúc và cùng một dấu thời gian, sẽ có một dấu sẽ được sắp xếp theo hàng đợi sự kiện này trước hàng kia (vì hệ thống của bạn sẽ truyền thông điệp đến quá trình javascript theo thứ tự nào đó).

Nếu bạn muốn biết cách javascript hẹn giờ làm việc với hàng đợi sự kiện, tôi khuyên bạn nên sâu sắc khi đọc John Resig's blog post about it

Nếu bạn muốn biết thêm thông tin về bao sự kiện mạng được truyền cho trình duyệt của bạn (javascript) , bạn nên tìm hiểu về số OSI Model.

Ví dụ: trình duyệt của bạn đang ở trong lớp OSI 7 (Ứng dụng), nhưng thứ tự các sự kiện mạng sẽ được quyết định bên dưới (lớp 3 đến 6).

Vì vậy, để tổng hợp câu trả lời: không ai có thể cho bạn biết changeMe sẽ là url1 hoặc url2. Javascript sẽ không quyết định thứ tự ở đây, nó sẽ được quyết định trong các lớp sâu hơn (card mạng, hệ điều hành của bạn, v.v.).

+1

Câu trả lời này có vẻ như âm thanh, bao gồm một số tham chiếu có thể kiểm chứng và có uy tín trong câu trả lời của bạn hỗ trợ yêu cầu của bạn sẽ là tuyệt vời. –

+1

@SamuelLiew: Nhận xét của bạn sẽ tuyệt vời nếu bạn không sao chép và dán chúng trên mọi câu trả lời. –

+0

Ngoài ra, http://stackoverflow.com/questions/7575589/how-does-javascript-handle-ajax-responses-in-the-background/7575649#7575649 trả lời câu hỏi. –

5

Trong các hoạt động không đồng bộ Javascript chạy trong nền, nhưng tất cả mã Javascript, kể cả gọi lại, chạy trong chuỗi tiền cảnh. Vì vậy, nó thực sự là không thể bằng cách thiết kế mà hai callback sẽ thực hiện cùng một lúc.

Nếu hai hoạt động không đồng bộ kết thúc vào cùng một thời điểm, cả hai sẽ báo hiệu hoàn thành cùng một lúc và sau đó trình lên lịch Javascript sẽ chọn một trong hai lần gọi lại để chạy trước.

Cuộc gọi lại nào trước tiên là triển khai và hệ điều hành cụ thể, cho tất cả các ý định và mục đích bạn có thể giả định nó sẽ là ngẫu nhiên.

+0

Câu trả lời này có vẻ như âm thanh, tuy nhiên, bao gồm một số tài liệu tham khảo có uy tín có thể kiểm chứng trong câu trả lời của bạn để hỗ trợ yêu cầu của bạn sẽ là tuyệt vời. –