2012-02-16 29 views
5

Vì vậy, trong javascript vì nó được điều khiển bởi tính chất của nó có vẻ như là setTimeout không chặn. Điều này có nghĩa rằng nếu tôi làm điều này:không bị chặn setTimeout trong javascript vs ngủ trong ruby ​​

setTimeout(function(){ 
    console.log('sleeping'); 
}, 10); 
console.log('prints first!!'); 

Nó sẽ ra 'prints first!!' và sau đó 'sleeping'.

Trình thông dịch viên js sẽ không đợi cho đến khi setTimeout được thực hiện thay vào đó nó thực thi đoạn mã bên dưới nó ngay lập tức. Khi 10ms trôi qua, nó sẽ thực hiện chức năng gọi lại.

Bây giờ tôi đã chơi xung quanh với ruby ​​gần đây. Tôi biết rằng nó có hỗ trợ không chặn trong thư viện máy sự kiện. Nhưng tôi tự hỏi nếu chúng ta có thể đạt được một cái gì đó tương tự như setTimeout ví dụ tôi vừa viết bằng javascript với sleep hoặc bất kỳ chức năng trong ruby ​​nguyên bản mà không có sự kiện hỗ trợ máy? Điều này có thể ở tất cả bằng cách sử dụng đóng cửa proc hoặc khối hoặc bất cứ điều gì? Cảm ơn.

Trả lời

5

Chức năng setTimeout không có gì giống như sleep vì trước đây không đồng bộ và sau đó là đồng bộ.

Phương pháp Ruby sleep, giống như đối tác POSIX của nó, tạm dừng thực thi tập lệnh. Chức năng setTimer trong JavaScript kích hoạt gọi lại vào một thời điểm trong tương lai.

Nếu bạn muốn kích hoạt gọi lại không đồng bộ, bạn có thể cần một cái gì đó như EventMachine để chạy vòng lặp sự kiện cho bạn.

2

Bạn có thể nhận được một số hành vi không đồng bộ rất cơ bản với chủ đề:

timeout = Thread.new(Time.now + 3) do |end_time| 
    while Time.now < end_time 
    Thread.pass 
    end 
    puts "Ding!" 
end 

main = Thread.new do 
    puts "Main" 
end 

main.join 
timeout.join 

Tôi không biết nếu bạn muốn đi xuống con đường của chương trình chủ đề. Điều đó có vẻ như quá mức với tôi, nhưng đó là một lựa chọn nếu bạn không thể sử dụng EventMachine.

+0

vâng, không giống như chuỗi sẽ là thứ tôi sẽ sử dụng. tôi biết async cần phải được thực hiện với máy sự kiện, nhưng tôi đã chỉ tò mò. thanks –

+0

Vấn đề lớn với các chủ đề kích hoạt callback async đang cố gắng thực thi khối gọi lại đó trên chuỗi gọi. Điều này là khó khăn, trừ khi bạn có một vòng lặp sự kiện thích hợp, nơi có những nơi được xác định rõ ràng để thực thi chúng. – tadman

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