2012-12-24 32 views
16

Chức năng kích hoạt có vẻ đồng bộ. Nghĩa là, tất cả các hàm ràng buộc xuất hiện để được thực hiện theo thứ tự, đồng bộ (hàm được gọi có thể làm điều gì đó không đồng bộ, nhưng đó không phải là câu hỏi).Chức năng kích hoạt jQuery được đảm bảo là đồng bộ

Điều này có đúng cho các sự kiện tùy chỉnh và không tùy chỉnh (nhấp, di chuột, v.v ...) không? Có bất kỳ sự kiện nào đảm bảo duy nhất luồng của javascript không đúng không?

Nếu đúng, hành vi có thể được thay đổi để thực thi chúng không đồng bộ mà không chèn thời gian chờ vào từng hàm bị ràng buộc không?

Đây là một mẫu mà chứng minh Câu hỏi đặt ra:

var ele = $('#blah'); 
// Example of the bound function doing something synchronously 
ele.bind('customEvent.sync', function() { 
    // Do something synchronously 
    window.foo = 'foo'; 
}); 

// Example of the bound function doing something asynchronously 
ele.bind('customEvent.async', function() { 
    window.setTimeout(function() { 
     // Do something asynchronously 
     window.bar = 'bar'; 
    }, 0); 
}); 

// Trigger both events 
ele.trigger('customEvent'); 

// If trigger is guaranteed to be synchronous this should alert 'foo:undefined' or possibly 'foo:bar' depending on whether the asych function was called first 
// If trigger is NOT synchronous 'undefined:undefined', 'foo:undefined', 'undefined:bar', or 'foo:bar' could be alerted 
alert(window.foo + ':' + window.bar); 

CẬP NHẬT Xem: Is JavaScript guaranteed to be single-threaded? sự kiện tuỳ chỉnh được đảm bảo để được đồng bộ vì bản chất ren duy nhất của javascript. Một số loại sự kiện được tạo sẵn có thể không đồng bộ do trình duyệt không nhất quán.

+0

dễ theo dõi hơn nếu bạn đưa ra ví dụ về mối quan tâm của bạn là gì – charlietfl

+0

Quan tâm của tôi là liệu tôi có thể dựa vào các hàm được gọi là trình kích hoạt của tôi được thực thi trước khi cuộc gọi sau kích hoạt – Kyle

+0

mâu thuẫn: "hàm được gọi có thể làm điều gì đó không đồng bộ .. nhưng đó không phải là câu hỏi" và "hành vi có thể thay đổi với thực thi async mà không chèn thời gian chờ vào mỗi hàm bị ràng buộc" (tôi mặc dù đó không phải là * câu hỏi?) –

Trả lời

16

Một sửa đổi nhẹ tuyển tập các ý kiến ​​được cung cấp trên bằng bản thân mình - Củ cải đường-Củ cải đường:

  • Sự kiện không có thời gian; cung cấp một handler được đính kèm, chúng gây ra một thread để bắt đầu. Do đó, một sự kiện có thể không đồng bộ hoặc không đồng bộ. Chuỗi mà sự kiện kích thích sẽ luôn đồng bộ nhưng có thể khởi động một hoặc nhiều quá trình không đồng bộ.

  • Cuộc gọi đến .trigger() luôn đồng bộ bất kể bất kỳ quá trình không đồng bộ nào có thể được bắt đầu trong trình xử lý sự kiện được kích hoạt. Khi trình xử lý được kích hoạt trả về, thực thi sẽ trả về câu lệnh sau .trigger (...). tức là, .trigger() là một hàm gọi hàm glorified.

  • Trong javascript, luồng hiện tại hoàn toàn được đảm bảo để chạy đến khi hoàn thành trước khi bất kỳ thứ gì được đặt vào vị trí setTimeout() bắt đầu, ngay cả khi thời gian chờ là 0. Cùng với ajax - một chuỗi gọi, $.ajax(...) là đảm bảo chạy để hoàn thành trước khi bất kỳ trình xử lý thành công/lỗi/hoàn thành nào bắt đầu, ngay cả khi máy chủ phản hồi ngay lập tức.

  • Chủ đề đơn là vốn có của ECMA-262 (javascript), tức là. tại bất kỳ thời điểm nào, có thể chạy tối đa một luồng.

điểm khác:

Câu trả lời acceped để Is javascript guaranteed to be single-threaded? được dựa trên một giả thuyết sai lầm. Không có bằng chứng được cung cấp rằng javascript không phải là đơn luồng. Nhận xét của @KrisGiesing đã làm rối loạn sự hiểu lầm.

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