2010-02-04 35 views
6

Có cách nào tốt để thực hiện một hoạt động lâu dài trong javascript không? Ví dụ, tôi có một chức năng có thể mất 2 phút để chạy. Làm thế nào để chúng ta phá vỡ một hoạt động lớn như thế này? Nếu tôi đang sử dụng java hoặc C, tôi sẽ thực hiện nhiệm vụ này trong một chủ đề nền. Có cách nào để nói với trình duyệt để tạm dừng thực hiện của kịch bản để nó có thể để cho tiền cảnh của nó/UI thread làm việc một lần nữa? Một cái gì đó như thế này ?:Chạy một hoạt động dài trong javascript?

function bigJob() { 
    for (i = 0; i < 1000000; i++) { 
     someWork(); 
     sleep(1000); 
    } 
} 

Cảm ơn

+0

Bạn muốn sử dụng bộ hẹn giờ và thực hiện một số công việc nhỏ ngay bây giờ. –

Trả lời

2

Nếu bạn muốn nó vào giấc ngủ, bạn sẽ chạy nó trong một khoảng thời gian:

var i = 0;  
var jobInterval = setInterval(bigJob, 1000); 

function bigJob() { 
     somework(); 

     i++; 
     if(i>1000000) { 
      clearInterval(jobInterval); 
     } 
} 

Bạn sẽ phải theo dõi số lần lặp trong hàm, và giết khoảng khi bạn đang thực hiện.

Nếu someWork() là chuyên sâu, bạn sẽ vẫn treo trình duyệt tại mỗi khoảng thời gian.

0

Nếu quảng cáo và như vậy đã được kích hoạt trên trình duyệt, bạn có thể mở một cửa sổ mới bên ngoài của vùng xem và có nó thực hiện kịch bản của bạn.

3

cách có thể:

  1. cửa sổ riêng biệt
  2. khối công việc xen kẽ với timer
  3. đề người lao động HTML5
  4. plugin NPAPI
  5. mở rộng

Tất cả đều đi xuống yêu cầu của bạn & c onstraints.

2

Bạn có thể làm một cái gì đó như:

function bigJob() { 
    setInterval(function() doPartOfTheJob, 100); 
} 

Điều này sẽ thực thi đoạn code của bạn mỗi 100 ms.

1

Bạn có thể chạy công việc dài trong nền.

Đây là một thư viện rất nhỏ cho phép bạn làm điều đó: http://adambom.github.io/parallel.js/

Nó cũng sử dụng tất cả các khả năng tính toán bởi vì nó sinh ra trên tất cả các lõi CPU ở chế độ nền.

mẫu để đặt một nhiệm vụ lâu trong nền:

var slowSquare = function (n) { 
    var i = 0; 
    while (++i < n * n) {} 
    return i; 
}; 
// Create a job 
var p = new Parallel(100000); 
// Spawn our slow function 
p.spawn(slowSquare).then(yourCallback); 

mẫu cho đa lõi:

var p = new Parallel([40, 41, 42]), 
    log = function() { console.log(arguments); }; 

function fib(n) { 
    return n < 2 ? 1 : fib(n - 1) + fib(n - 2); 
}; 

p.map(fib).then(log); // returns [165580141, 267914296, 433494437] 

Nó có một dự phòng để sử dụng Timeouts trong trường hợp trình duyệt không hỗ trợ người lao động.

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