2012-06-20 31 views
8

Vì vậy, tôi đã tự hỏi một cách tốt hơn (về tăng trưởng và hiệu năng của chồng) để đệ quy gọi một hàm theo khoảng thời gian đều đặn là gì? Ví dụ: , cho phép nói rằng tôi muốn đọc nội dung tệp cứ 200 ms một lần. Tôi có hai phương pháp sau đây và tự hỏi liệu chúng có khác nhau không?Chức năng gọi một cách đệ quy trong khoảng thời gian đều đặn

Phương pháp 1: Sử dụng ols đồng bằng setTimeout mà không process.nextTick

var fs = require('fs'); 
(function loop() { 
    // Print to time to indicate something is happening 
    console.log(new Date().toString()); 

    // Read a 51MB file 
    fs.readFile('./testfile', function (err, data) { 
    if (err) console.log(err); 
    }); 

    // Call the same function again 
    setTimeout(function() { 
    loop(); 
    }, 200); 
})(); 

Cách 2: Gọi process.nextTick bên setTimeout

var fs = require('fs'); 
(function loop() { 
    // Print to time to indicate something is happening 
    console.log(new Date().toString()); 

    // Read a 51MB file 
    fs.readFile('./testfile', function (err, data) { 
    if (err) console.log(err); 
    }); 

    // Call the same function again 
    setTimeout(function() { 
    process.nextTick(function() { 
     loop(); 
    }); 
    }, 200); 
})(); 

Những gì tôi muốn biết là thêm process.nextTick bên trong setTimeout có giúp ích hay không? Sẽ gọi hàm bên trong process.nextTick sẽ làm giảm bớt việc sử dụng stack hay không?

+2

Không trả lời bạn, nhưng bạn chắc chắn nên đặt 'setTimeout' trong hàm gọi lại của 'readFile'. –

+1

Tôi không thấy bất kỳ cuộc gọi đệ quy nào tại đây. Vòng lặp cuộc gọi được gọi khi sự kiện thời gian chờ xảy ra, không phải từ bên trong hàm. Không thể gọi cho đến khi vòng lặp() trả về – jcoder

Trả lời

28

Không có đệ quy trong ví dụ đơn giản sau:

function test() 
{ 
    console.trace(); 
    setTimeout(test, 1000); 
} 

test(); 

đầu ra (lưu ý chồng mà không phát triển)

Trace 
    at test (/private/tmp/rec.js:3:12) 
    at Object.<anonymous> (/private/tmp/rec.js:7:1) 
    at Module._compile (module.js:449:26) 
    at Object..js (module.js:467:10) 
    at Module.load (module.js:356:32) 
    at Function._load (module.js:312:12) 
    at module.js:487:10 
    at EventEmitter._tickCallback (node.js:238:9) 
Trace 
    at Object.test [as _onTimeout] (/private/tmp/rec.js:3:12) 
    at Timer.ontimeout (timers.js:101:19) 
Trace 
    at Object.test [as _onTimeout] (/private/tmp/rec.js:3:12) 
    at Timer.ontimeout (timers.js:101:19) 
Trace 
    at Object.test [as _onTimeout] (/private/tmp/rec.js:3:12) 
    at Timer.ontimeout (timers.js:101:19) 
Trace 
    at Object.test [as _onTimeout] (/private/tmp/rec.js:3:12) 
    at Timer.ontimeout (timers.js:101:19) 
Trace 
    at Object.test [as _onTimeout] (/private/tmp/rec.js:3:12) 
    at Timer.ontimeout (timers.js:101:19) 
Trace 
    at Object.test [as _onTimeout] (/private/tmp/rec.js:3:12) 
    at Timer.ontimeout (timers.js:101:19) 
+0

+1 Câu trả lời hoàn hảo. Tôi đang xóa của tôi. –

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