2014-08-28 19 views
6

tôi có mã như sau:Điều gì xảy ra với mã sau history.back()?

window.history.back(); 
myFunction(10); 
  • history.back() một chặn/non-blocking cuộc gọi?

  • Có bảo đảm rằng myFunction() sẽ được thực thi không? hoặc sẽ không được thực hiện?

  • Đây có phải là một điều kiện chủng tộc có thể nơi history.back() xảy ra không đồng bộ và liệu myFunction() được gọi là phụ thuộc vào thời gian của các sự kiện không thể kiểm soát?

+0

Câu hỏi thú vị, nhưng kinh nghiệm của bạn về vấn đề này là gì? Bạn đã thử điều này chưa? – Peter

+2

Đây là một câu hỏi hay! Đọc [thông số] (http://www.w3.org/TR/2011/WD-html5-20110113/history.html#traverse-the-history-by-a-delta), 'myFunction' có thể được gọi nếu 'BeforeUnloadEvent' hủy điều hướng ở ít nhất – CodingIntrigue

+0

@Peter Hàm chạy; tuy nhiên tôi muốn chắc chắn. – teddbytee

Trả lời

5

spec nói rằng history.backqueues a task.

Mã thao tác lịch sử thực tế (bên trong quá trình triển khai JS) do đó sẽ được thực hiện trong lần chạy tiếp theo của chính event loop. Cuộc gọi của bạn để myFunction thực thi đồng bộ trong vòng thực thi hiện tại, vì vậy nó sẽ luôn được thực thi trong môi trường tuân thủ.

Tuy nhiên, chỉ có mã đồng bộ trong myFunction được đảm bảo để thực thi. Hãy xem xét ví dụ này:

function myFunction() { 
    console.log('synchronous'); 
    debugger 

    setTimeout(function() { 
    console.log('async'); 
    debugger 
    }) 
} 

window.history.back(); 
myFunction(); 

Tuyên bố trình gỡ rối đầu tiên luôn được nhấn. Thứ hai, được hoãn lại cho một vòng lặp sự kiện trong tương lai bằng cách sử dụng setTimeout, sẽ không.

This article là giải thích tốt về vòng lặp sự kiện JavaScript

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