2013-08-29 46 views
6

Tôi đã cố gắng hiểu về cách thức hoạt động được hoãn lại, do đó, trong tất cả chúng, chúng sử dụng setTimeout.Tại sao sử dụng setTimeout trong hoãn lại

this.callbacks;// array of functions reference 
this.callbacks.forEach(function(callback){ 
    window.setTimeout(function(){ 
      callback(data); 
    },0); 
}); 

một ví dụ từ this questions sử dụng setTimeout

resolve: function (data) { 
    this.promise.okCallbacks.forEach(function(callback) { 
     window.setTimeout(function() { 
     callback(data) 
     }, 0); 
    }); 
    }, 

là gì khác nhau giữa gọi chức năng trong vòng lặp bởi setTimeout hơn callback(); hoặc callback.call();

Trả lời

10

Lý do để thực hiện việc này là cho phép chuỗi javascript có cơ hội kích hoạt bất kỳ sự kiện nào khác có thể đang chờ trong hàng đợi.

Javascript là một luồng. Nếu một sự kiện được kích hoạt, nó chỉ có thể chạy khi mã hiện đang chạy đã kết thúc.

Sử dụng setTimeout với thời gian trễ bằng 0 hiệu quả cho trình thông dịch JS biết rằng cuộc gọi hàm callback là một phần của ngữ cảnh mới và khối mã hiện tại của bạn đã hoàn tất. Điều này có nghĩa là JS sẽ nắm lấy cơ hội trước khi gọi số callback() để kiểm tra xem có cần xử lý bất kỳ sự kiện nào khác không.

Mặc dù điều này có thể làm chậm callback() bản thân khỏi bị gọi là ngay lập tức, điều này có thể tốt cho hiệu suất tổng thể của trang web của bạn:

sự kiện khác có thể cần phải được xử lý bao gồm các sự kiện và nhấp trigger UI khác. Nếu bạn không cho họ cơ hội thực thi, nó có thể làm cho giao diện người dùng của bạn xuất hiện chậm chạp hoặc không đáp ứng.

2

setTimeout chạy sau khi thời gian đã trôi qua quá trình JavaScript hoàn toàn miễn phí.

Sử dụng call sẽ chạy cuộc gọi lại ngay lập tức và chặn mọi thứ khác.

+0

nhưng thời gian được đặt là 0 –

+0

@ Moein7tl: Trên thực tế có giới hạn dưới với thời gian chờ, lớn hơn 0 (IIRC là khoảng 4 giây đối với các trình duyệt phổ biến). Do đó 0 có nghĩa là "ngay sau khi bạn có thể nhận được vòng với nó". Có lẽ những người sử dụng một thời gian chờ không biết về điều này và làm điều đó vào mục đích. – Jon

+1

@ Moein7tl - Có, lưu ý rằng sau khi tôi nói "thời gian đã trôi qua" tôi đã nói ** "và" **. – Quentin

2

setTimeout(func,0) không được gọi ngay lập tức.

Đơn giản là nó mô phỏng một hàm không đồng bộ với một cuộc gọi lại.

function asyncFunc(callback) { 
    console.log("step1"); 
    setTimeout(callback,0); 
    console.log("step2"); 
} 

asyncFunc(function() {console.log("async step")}); 
/* output: 
step1 
step2 
async step 
*/ 

https://developer.mozilla.org/en-US/docs/Web/API/window.setTimeout

Mã thực hiện bởi setTimeout() được chạy trong một bối cảnh thực hiện riêng biệt với chức năng mà từ đó nó được gọi là

Vì vậy, nó chạy trong một bối cảnh thực hiện riêng biệt, nhưng trước khi thực hiện nó, javascript sẽ kết thúc thực hiện hiện tại do javascript chạy trên thread đơn.

Không quan trọng bao nhiêu thời gian trong quá trình thực thi hiện tại, vì nó PHẢI kết thúc trước khi thực hiện một tác vụ khác.

nếu bạn có vòng lặp vô hạn trước khi kết thúc tác vụ, ví dụ: gọi lại của bạn sẽ không bao giờ được gọi.

1

setTimeout() cho phép bạn đăng ký một hàm để được gọi một lần sau một khoảng thời gian nhất định đã trôi qua.

Phương thức setTimeout() của đối tượng Window lập lịch để chạy sau số mili giây được chỉ định. setTimeout() trả về một giá trị có thể là được chuyển đến clearTimeout() để hủy thực hiện chức năng được lập biểu.

Nếu bạn gọi setTimeout() với thời gian là 0 ms, hàm bạn chỉ định không được gọi ngay lập tức. Thay vào đó, nó được đặt trên một hàng đợi để được gọi "càng sớm càng tốt" sau khi mọi trình xử lý sự kiện đang chờ xử lý kết thúc chạy.

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