Như đã trình bày bởi Grumdrig bạn có thể viết mã như thế này:
setTimeout(function() { iterateArray(array1); reportDone(1); }, 0);
setTimeout(function() { iterateArray(array2); reportDone(2); }, 0);
Nhưng nó sẽ vẫn không chạy đồng thời . Dưới đây là ý tưởng chung về những gì xảy ra sau khi hết thời gian chờ như vậy được gọi là:
- Bất kỳ mã nào sau khi các cuộc gọi
setTimeout
sẽ chạy ngay lập tức, bao gồm cả các hàm gọi lại.
- Nếu có các bộ đếm thời gian khác trong hàng đợi vào hoặc quá thời gian trễ hoặc khoảng thời gian, chúng sẽ được thực hiện từng lần.
- Trong khi bất kỳ bộ hẹn giờ nào đang chạy, một bộ hẹn giờ khác có thể đạt khoảng thời gian trễ/trễ, nhưng nó sẽ không chạy cho đến khi bộ đếm thời gian kết thúc.
- Một số trình duyệt ưu tiên các sự kiện được kích hoạt từ tương tác của người dùng như
onclick
và onmousemove
, trong trường hợp đó, các chức năng được đính kèm với các sự kiện đó sẽ được thực hiện theo chi phí chính xác của hẹn giờ.
- Thao tác này sẽ tiếp tục cho đến khi có lệnh mở (không có bộ hẹn giờ hoặc trình xử lý sự kiện nào được yêu cầu thực hiện trước đó). Chỉ sau đó các hàm trong mã ví dụ sẽ được chạy. Một lần nữa, tại một thời điểm, với một lần đầu tiên có khả năng nhưng không chắc chắn thực hiện đầu tiên. Ngoài ra, tôi đang mạo hiểm đoán rằng một số trình duyệt có thể áp đặt thời gian trễ tối thiểu, điều này sẽ làm cho bất kỳ bộ hẹn giờ nào được đặt với độ trễ là 0 mili giây được chạy thậm chí muộn hơn mong đợi.
Rõ ràng không có lợi thế về hiệu suất để chạy mã như thế này. Trong mọi trường hợp, mọi thứ sẽ mất nhiều thời gian hơn để hoàn thành. Tuy nhiên, trong trường hợp một tác vụ mất quá nhiều thời gian để đóng băng trình duyệt (và có thể là các cảnh báo trình duyệt "quá dài"), nó có thể hữu ích để chia nhỏ thành các phần thực thi nhanh hơn chạy tuần tự sau một thời gian trễ , do đó giúp cho trình duyệt có thời gian để thở.
Nhân viên Web đã được đề cập và nếu bạn không quan tâm đến khả năng tương thích của IE thì bạn có thể sử dụng chúng để thực hiện đồng thời đúng. Tuy nhiên có một số hạn chế nghiêm trọng về việc sử dụng chúng được áp dụng vì lý do an ninh.Đối với một người không thể tương tác với DOM theo bất kỳ cách nào, có nghĩa là bất kỳ thay đổi nào đối với trang vẫn phải được thực hiện đồng bộ. Ngoài ra, tất cả dữ liệu được truyền đến và đi từ các công nhân được tuần tự hóa khi chuyển tiếp, có nghĩa là không thể sử dụng các đối tượng Javascript thực sự. Điều đó đang được nói, để xử lý dữ liệu chuyên sâu, các Web Worker có lẽ là một giải pháp tốt hơn là phá vỡ một hàm thành nhiều nhiệm vụ bị trì hoãn.
Có vẻ như bạn quan tâm đến việc xử lý song song, không nhất thiết phải thực thi không đồng bộ? Tôi đã không xem xét nó sâu, nhưng không iframes sử dụng một chủ đề js riêng biệt? Tôi không thể tưởng tượng nó sẽ được vui vẻ, nhưng bạn có thể làm một số nhiệm vụ song song bằng cách sử dụng các chức năng trong iframe. – jball
iframe có thể là một kỹ thuật thú vị, mặc dù tôi nghĩ rằng chi phí của iframe sẽ nhiều hơn số âm so với chương trình không đồng bộ tiền thưởng sẽ cung cấp. – aepheus
Ý tưởng thú vị, nhưng tôi nghĩ rằng trong hầu hết hoặc tất cả các trình duyệt, một khung nội tuyến sử dụng cùng một chuỗi JS. Trong thực tế, tôi nghĩ rằng trong tất cả trừ Chrome, tất cả các cửa sổ và tab sử dụng cùng một chuỗi JS. – Grumdrig