2013-01-12 75 views
7

Tình huống là:Làm thế nào để giới hạn thời gian thực hiện của một hàm trong javascript?

Người dùng viết một số mã js và nó sẽ được chạy trên một số dữ liệu (cục bộ). Nhưng đôi khi có vòng lặp vô tận hoặc các cuộc gọi đệ quy… Đó là lý do tại sao tôi cần giới hạn thời gian thực hiện của một hàm nhưng không phải để chỉnh sửa chính hàm đó (và thậm chí nếu vậy - tôi có nên chèn kiểm tra sau mỗi điểm chuỗi không?) về các cuộc gọi đệ quy?)

Có giải pháp nào khác cho vấn đề lạ này không? Có lẽ eval có thể cung cấp cho một số cây phân tích cú pháp của mã hoặc một cái gì đó như thế?

+0

Có lý do nào bạn thích cố gắng hủy bỏ việc thực hiện để đơn giản tránh các vòng lặp vô hạn/đệ quy không? –

+0

Khi bạn nói nó chạy trên một số dữ liệu cục bộ, bạn có nghĩa là trên máy của người dùng, hoặc cục bộ trên một số máy chủ dưới sự kiểm soát của bạn. Nếu sau này, liệu nó có đang chạy trong môi trường Node.js không? – DWright

+0

Lý do là tập lệnh thực thi mã của người dùng, không phải của tôi – user1431314

Trả lời

2

Đây có phải là trong trình duyệt hoặc trong nút không?

Trong trình duyệt bạn có thể đặt mã của bạn trong một 0 giây setTimeout để giải phóng các vòng lặp chạy (và mở khóa các trình duyệt tạm thời)

setTimeout(function() { 
    // your code here 
}, 0) 

nút có cái gì đó fancier trông như thế này và là tốt hơn một chút :

process.nextTick(function() { 
    // frees up the run loop even faster 
}); 
5

Một giải pháp có thể đang sử dụng Web Workers. Một nhân viên web được bắt đầu trong một chủ đề riêng biệt và có thể được chấm dứt.

var worker = new Worker('my_task.js'); 
... 
worker.terminate(); 

Nhược điểm là not all browsers support Nhân viên web.

+1

Công nhân Web cũng không thể truy cập các phần tử DOM. Đó có thể là một vấn đề, đặc biệt là kể từ khi rõ ràng, đây là mã không rõ. –

+0

Lưu ý: Như thường lệ, chủ đề nền — kể cả công nhân — không thể thao tác DOM. Nếu các hành động được thực hiện bởi chủ đề nền cần phải dẫn đến thay đổi đối với DOM, họ sẽ đăng thông điệp lại cho người sáng tạo của họ để thực hiện công việc đó. – asgoth

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