setTimeout là không chặn, không đồng bộ. Bạn cung cấp cho nó một cuộc gọi lại và khi sự chậm trễ kết thúc, gọi lại của bạn được gọi.
Dưới đây là một số hiện thực:
Sử dụng đệ quy
Bạn có thể sử dụng một recursive call trong setTimeout
gọi lại.
function waitAndDo(times) {
if(times < 1) {
return;
}
setTimeout(function() {
// Do something here
console.log('Doing a request');
waitAndDo(times-1);
}, 1000);
}
Dưới đây là làm thế nào để sử dụng chức năng của bạn:
waitAndDo(2000); // Do it 2000 times
Về lỗi stack overflow: setTimeout
rõ ràng các cuộc gọi stack (xem this question) do đó bạn không phải lo lắng về stack overflow trên setTimeout
cuộc gọi đệ quy.
Sử dụng máy phát điện (io.js, ES6)
Nếu bạn đang sử dụng io.js ("tiếp theo" Node.js sử dụng ES6), bạn có thể giải quyết vấn đề của bạn mà không đệ quy với một giải pháp thanh lịch:
function* waitAndDo(times) {
for(var i=0; i<times; i++) {
// Sleep
yield function(callback) {
setTimeout(callback, 1000);
}
// Do something here
console.log('Doing a request');
}
}
Dưới đây là làm thế nào để sử dụng chức năng của bạn (với co):
var co = require('co');
co(function*() {
yield waitAndDo(10);
});
BTW: Đây thực sự là sử dụng một loop;)
Generator functions documentation.
Nguồn
2015-06-01 14:03:36
Đó là hoạt động tuyệt vời. Cảm ơn rất nhiều. – glasspill
Chào mừng. Nếu yêu cầu của bạn đến máy chủ không phải là thời gian quan trọng, bạn thậm chí còn tốt hơn sử dụng một công trình xây dựng, nơi một bộ đếm thời gian mới chỉ được bắt đầu sau khi cuộc gọi máy chủ trước đó đã kết thúc. Sau đó, chỉ có một cuộc gọi máy chủ sẽ hoạt động ngay cả khi cuộc gọi mất hơn 1 giây (giá trị bộ đếm thời gian setTimeout) –
** WARNIG **: Giải pháp của bạn có thể dẫn đến 'RangeError: Kích thước ngăn xếp cuộc gọi tối đa đã vượt quá'. Vui lòng xem [giải pháp này] (http://stackoverflow.com/a/30575612/1480391) sử dụng 'setImmediate'. BTW OP đang sử dụng Node.js .. (không có 'cảnh báo' trong Node.js). –