2010-11-16 26 views
6

Tôi có trong một trang HTML, một phần tử xuất hiện nhiều lần và chạy cùng một JS. Vấn đề là, tôi muốn nó làm một chức năng cụ thể chỉ khi nó là người đầu tiên chạy nó (anh chị em của anh ta không bao giờ chạy nó - YET).Cách tạo Semaphore giữa các phần tử HTML được tải không đồng bộ

Tôi cần semaphore để đồng bộ hóa giữa chúng. Tôi không thể biết cách khai báo biến và thực hiện semaphore theo cách này trong JS.

Trả lời

7

Có rất nhiều cách tiếp cận.

Bạn cần đặt cờ ở đâu đó. Trong bất kỳ điều gì khác, bạn có thể đặt nó trên window, nhưng sử dụng tên không có khả năng xung đột với bất kỳ điều gì khác.

Sau đó, JavaScript là khá đơn giản:

if (!window.myUniqueNameFlag) { 
    window.myUniqueNameFlag = true; 
    // Do your processing 
} 

Nhưng một lần nữa, đưa mọi thứ trở về window không phải là lý tưởng nếu bạn có thể tránh nó, mặc dù nó rất thực tế phổ biến. (Bất kỳ chức năng hoặc biến nào bạn khai báo ở phạm vi toàn cầu là tài sản của window.)

Nếu hàm của bạn đã được khai báo ở phạm vi toàn cầu (và do đó đã chiếm một biểu tượng), bạn có thể thực hiện việc này để tránh tạo biểu tượng thứ hai. Thay vì:

function foo() { 
    // ...your processing... 
} 

Làm điều này:

var foo = (function() { 
    var flag = flase; 

    function foo() { 
     if (!flag) { 
      flag = true; 
      // ...your processing... 
     } 
    } 

    return foo; 
})(); 

Điều đó có vẻ phức tạp, nhưng nó không phải là thực sự: Chúng tôi xác định một chức năng ẩn danh, trong đó chúng ta định nghĩa một biến và một hàm lồng nhau, sau đó chúng tôi trả lại tham chiếu hàm lồng nhau và gán nó vào biến số foo bên ngoài. Bạn có thể gọi foo và bạn sẽ nhận được hàm lồng nhau. Hàm lồng nhau có một tham chiếu lâu dài với biến số flag bởi vì nó là closure over the variable, nhưng không ai khác có thể nhìn thấy nó. Nó hoàn toàn riêng tư.

Một thứ ba lựa chọn là chỉ cần sử dụng một lá cờ trên đối tượng chức năng chính:

function foo() { 
    if (!foo.flag) { 
     foo.flag = true; 
     // ...do your processing... 
    } 
} 

Chức năng chỉ là các đối tượng có khả năng được gọi, vì vậy bạn có thể thêm các thuộc tính đối với họ.

+2

Nó không phải là hoạt động nguyên tử. về mặt lý thuyết, cả hai yếu tố có thể vượt qua điều kiện if trước khi gán biến số – Himberjack

+5

@oshafran: JavaScript trên trình duyệt được đảm bảo là đơn luồng chặn việc sử dụng [công nhân web] mới (http://www.w3.org/TR/workers /) stuff, yêu cầu cú pháp rõ ràng. Vì vậy, ** ở trên là ** nguyên tử trên trình duyệt. Nếu bạn đang sử dụng một số môi trường khác, và * if * môi trường đó là đa luồng, bạn sẽ sử dụng các cơ chế đồng bộ được cung cấp bởi môi trường. Nhưng bạn đã nói điều này dựa trên trình duyệt, vì vậy không cần thiết. –

+0

Cảm ơn! .............. – Himberjack

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