2013-01-24 51 views
21

Tại sao tôi tiếp tục gặp lỗi này?Uncaught ReferenceError: importScripts không được xác định

Tôi có thể sử dụng chức năng toàn cầu này ngay?

http://www.html5rocks.com/en/tutorials/workers/basics/

Tôi đang sử dụng chrome.

Tôi đang sử dụng https://code.google.com/p/bitjs/ và nó bắt đầu với

importScripts('io.js'); 
importScripts('archive.js'); 
+0

Làm cách nào để bạn sinh ra công nhân? – Bergi

+0

Nghĩ rằng điều này sẽ sinh ra một công nhân? Đây là cách họ sử dụng nó trong https://code.google.com/p/bitjs/source/browse/unzip.js – netigger

+0

Không, điều này cần phải được bên trong một kịch bản công nhân. Xem https://code.google.com/p/bitjs/source/browse/archive.js#278 về cách họ thực hiện hoặc thực hiện theo các hướng dẫn mà bạn đã liên kết – Bergi

Trả lời

10

Mã này cần phải được bên trong một kịch bản người lao động. Bản thân nhân viên được tạo thông qua một đối tượng Worker mới - xem Getting Started in the tutorial.

Mã bạn đã liên kết nằm bên trong công nhân đã tạo here.

6

Tôi cũng gặp lỗi này. Trong trường hợp của tôi, đó là vì tôi đang thử nghiệm mã bằng cách sử dụng Karma/Jasmine. Do khung công tác kiểm tra, tệp worker.js cũng được nạp bởi chủ đề chính.

Tôi tránh lỗi này bằng cách wrappig file worker.js với:

if('undefined' === typeof window){ 
     importScripts('workerscript2.js'); 
    ... 
    } 

Vui lòng tham khảo góp ý dưới đây của Rob, trong đó cung cấp một giải pháp thay thế.

+0

Đây là cách giải quyết thông minh khi sử dụng Jasmine. +1 – Liam

+4

Thay vào đó, hãy cân nhắc sử dụng ''function' === typeof importScripts'. –

20

Khi bạn tạo một nhân viên, nó thực sự được thực thi hai lần. Pass đầu tiên nằm trong ngữ cảnh của đối tượng 'window' toàn cục (nghĩa là bạn có quyền truy cập vào tất cả các chức năng của đối tượng cửa sổ). Cuộc gọi thứ hai thông qua là trong bối cảnh của người lao động có một đối tượng toàn cầu khác, một nơi 'importScripts' tồn tại.

// proper initialization 
if('function' === typeof importScripts) { 
    importScripts('script2.js'); 
    addEventListener('message', onMessage); 

    function onMessage(e) { 
    // do some work here 
    }  
} 

Lưu ý addEventListener nằm trong câu lệnh if. Nếu bạn đặt nó bên ngoài của nó, gọi lại của bạn sẽ được đăng ký hai lần. Một lần trên cửa sổ 'toàn cầu' và một lần trên toàn cầu của nhân viên.

Mã hóa vui vẻ!

+3

Câu trả lời của bạn có ý nghĩa. bạn có thể vui lòng chỉ cho tôi một số liên kết để biết thêm về việc thực hiện hai lần. – lokeshjain2008

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