2011-10-28 45 views
10

Tôi hiện đang viết một thư viện nhỏ bằng JavaScript để giúp tôi ủy nhiệm cho một nhân viên web một số tính toán nặng.Phát hiện đáng tin cậy nếu tập lệnh đang thực thi trong một nhân viên web

Vì một số lý do (chủ yếu cho khả năng gỡ lỗi trong chuỗi giao diện người dùng và sau đó chạy cùng một mã trong công nhân), tôi muốn phát hiện xem tập lệnh hiện đang chạy trong công nhân hay trong chuỗi giao diện người dùng.

Tôi không phải là developper Javascript dày dạn và tôi muốn đảm bảo rằng các chức năng sau đây chắc chắn sẽ phát hiện nếu anh ở một công nhân hay không:

function testenv() { 
    try{ 
     if (importScripts) { 
      postMessage("I think I'm in a worker actually."); 
     } 
    } catch (e) { 
     if (e instanceof ReferenceError) { 
      console.log("I'm the UI thread."); 
     } else { 
      throw e; 
     } 
    } 
} 

Vì vậy, đúng không?

+0

'e if e instanceof ReferenceError' sẽ ném một lỗi cú pháp. –

+0

Nó đã được Firefox cụ thể, cố định ngay bây giờ. – thomas

+0

Câu hỏi liên quan (không có câu trả lời, mặc dù): [Có cơ chế chuẩn nào để phát hiện xem JavaScript có đang thực thi như một WebWorker không?] (Http://stackoverflow.com/questions/7507638/is-there-a-standard- cơ chế-phát hiện-nếu-a-javascript-đang-thi hành-as-a-chúng tôi) –

Trả lời

8

Như đã lưu ý, có một câu trả lời trong số another thread cho biết để kiểm tra sự hiện diện của đối tượng tài liệu trên cửa sổ. Tuy nhiên, tôi muốn thực hiện sửa đổi mã của bạn để tránh thực hiện khối try/catch mà slows execution of JS in Chrome và cũng có khả năng trong các trình duyệt khác.

EDIT: Tôi đã thực hiện một lỗi trước đây trong giả định có một đối tượng cửa sổ trong phạm vi toàn cục. Tôi thường thêm

//This is likely SharedWorkerContext or DedicatedWorkerContext 
window=this; 

lên đầu tập lệnh trình tải công nhân của tôi cho phép tất cả các chức năng sử dụng tính năng phát hiện cửa sổ để không phát nổ. Sau đó, bạn có thể sử dụng chức năng dưới đây.

function testEnv() { 
    if (window.document === undefined) { 
    postMessage("I'm fairly confident I'm a webworker"); 
    } else { 
    console.log("I'm fairly confident I'm in the renderer thread"); 
    } 
} 

Hoặc không có cửa sổ gán miễn là phạm vi ở cấp cao nhất.

var self = this; 
function() { 
    if(self.document === undefined) { 
    postMessage("I'm fairly confident I'm a webworker"); 
    } else { 
    console.log("I'm fairly confident I'm in the renderer thread"); 
    } 
} 
+0

Cảm ơn bạn đã chỉ ra rằng bạn nên tránh thử. Vì nó là một công cụ trò chơi đồ chơi tôi mã hóa, tốc độ là một khía cạnh quan trọng đối với tôi. – thomas

+0

Lưu ý rằng 'tự' thực sự có sẵn theo mặc định trong công nhân web https://developer.mozilla.org/en/docs/Web/Guide/Performance/Using_web_workers –

+0

@JamiePate, 'this' cũng hoạt động. Xem https://stackoverflow.com/a/45657328/632951 – Pacerier

24

Khá muộn để các trò chơi trên thế này, nhưng đây là cách tốt nhất, bulletproofy nhất mà tôi có thể đưa ra:

// run this in global scope of window or worker. since window.self = window, we're ok 
if (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) { 
    // huzzah! a worker! 
} else { 
    // I'm a window... sad trombone. 
} 
+0

Liệu: if (self.WorkerGlobalScope) {} else {} có hoạt động không? Miễn là không ai thêm WorkerGlobalScope vào dự án ... có vẻ hiệu quả và súc tích. –

+1

Bạn có thể, nhưng tôi đã đi kiểm tra đôi vì nó đáng tin cậy hơn hy vọng ai đó sẽ không viết trên 'self.WorkerGlobalScope' (mà chắc chắn là không chắc chắn, nhưng tôi thích mặc định để chống đạn hơn) – borbulon

+0

làm việc cho tôi: self instanceof Window – mbelow

9

Emscripten làm:

// *** Environment setup code *** 
var ENVIRONMENT_IS_NODE = typeof process === 'object' && typeof require === 'function'; 
var ENVIRONMENT_IS_WEB = typeof window === 'object'; 
var ENVIRONMENT_IS_WORKER = typeof importScripts === 'function'; 
var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; 

(Emscripten on Github)

+0

Bạn cũng có thể muốn kiểm tra [câu trả lời này] (http://stackoverflow.com/a/33697246/304175) bởi @NikosM để xem Asynchronous.js làm gì. – skalee

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