2012-02-11 14 views
9

Tôi có một ứng dụng làm việc tốt bằng văn bản với Requirejs và Backbonejs, nhưng nó thực sự làm chậm đôi khi ... Ví dụ khi nói đến làm cho một số công việc số học! Tôi cố gắng để sử dụng một Worker Web để làm công việc này số học như thế này:Làm thế nào để sử dụng công nhân Web vào một mô-đun xây dựng với Requirejs?

My Module (traffic.js):

define(["jquery", "use!underscore", "use!backbone", "namespace" ], 
    function ($, _, Backbone, globals) { 
    ..... 
    var worker = new Worker("arithmetic.js"); 
    worker.addEventListener('message', function(e) { 
     console.log(e.data); 
    }, false); 

    worker.postMessage(globals.data); // Send data to our worker. 
    }); 

arithmetic.js:

define(["use!underscore", "use!backbone" ], 
    function ($, _) { 
     //Here die Operations 
}); 

Nhưng tôi có lỗi xác định không được xác định !!

Tôi đã thử nó như this quá nhưng không thành công !!

Làm thế nào để sử dụng Web Worker thành requirejs hoặc với backbonejs ??

Cảm ơn!

Trả lời

12

Bạn có thể sử dụng requireJS từ nhân viên web: xem API docs để biết thêm thông tin.

Yêu cầu duy nhất là tải requireJS khi bắt đầu công nhân web với importScripts(…). Khi đã tải xong, bạn có thể sử dụng define và sử dụng requireJS như bình thường.

Phần quan trọng đối với tôi khi tôi bắt đầu làm việc là đảm bảo rằng bạn cũng đang nạp cùng cấu hình bootstrap (ví dụ: config.js hoặc main.js) trong nhân viên web mà bạn đang sử dụng trong phần còn lại của ứng dụng. Đây là nội dung mà tài liệu đang nói đến khi nói:

Bạn có thể cần đặt tùy chọn cấu hình baseUrl để đảm bảo yêu cầu() có thể tìm thấy tập lệnh cần tải.

Một điều nữa là bạn có thể tải các công nhân từ tập tin traffic.js của bạn với một ID mô-đun (thay vì thể xác định rõ con đường script) sử dụng this requireJS plugin.

+0

Tôi có thể yêu cầu nhân viên web tải và khởi động, nhưng nó sẽ không trả lời 'postMessage()' nếu 'addEventListener()' được thực hiện trong khối 'require (function {})'. Trình nghe sự kiện công nhân của tôi cần gọi các mô-đun requirej khác nhau. Ví dụ trong tài liệu API bạn đã đề cập, cụ thể là https://github.com/jrburke/requirejs/blob/master/tests/workers.js, không đặt bất kỳ trình nghe 'onmessage' nào. Bất kỳ ý tưởng? – Fuhrmanator

+0

@Fuhrmanator Ngoài ra, bạn có thể đặt trực tiếp bộ xử lý sự kiện 'onmessage' (mặc dù addEventListener luôn được các ninja ninja khuyến khích). (http://www.html5rocks.com/en/tutorials/workers/basics/). ** Nếu bạn sử dụng plugin requireJS cho công nhân web, hãy sử dụng cú pháp onmessage, ** otherwhise nếu công nhân bản địa không khả dụng, các proxy-worker.js giả mạo kèm theo plugin sẽ không hoạt động. –

+1

@puro_nervio Tôi đã có thể làm cho nó hoạt động cuối cùng. Một ví dụ làm việc mà tôi tìm thấy có công nhân thực hiện một 'postMessage()' để trả lời luồng chính trước khi nó thực hiện một 'addEventListener()'. Tôi nghĩ rằng vấn đề của tôi là các chủ đề đã không sẵn sàng khi thread chính của tôi đã cho nó làm việc để làm. Các requirejs của một số mô-đun mất một thời gian, do đó, 'addEventListener' không được thực thi trước khi luồng chính đã làm' postMessage() 'của nó để cho nó bắt đầu làm một cái gì đó. Nói cách khác, chủ đề chính phải đồng bộ hóa với nó trước tiên. – Fuhrmanator

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