当process.nextTick
功能已在start
内时,是否需要从process.nextTick
调用启动功能?我想让accept
和start
函数同步?应该达到这个目标的理想方法是什么?
function accept() { // ACCEPT FUNCTION
process.nextTick(() => {
start(); // START CALL
});
}
function start() { // START FUNCTION
process.nextTick(() => {
startPolling();
});
}
答案 0 :(得分:0)
没有。如果startPolling()
功能阻止,则将其置于nextTick()
回调中无法获得帮助。它将在事件循环的下一个滴答中阻塞整个线程 - 但它仍将阻止它。
示例:
没有nextTick
:
function x() {
fs.readFileSync('file');
}
x(); // <-- it blocks here
console.log('...');
使用nextTick
:
function x() {
pricess.nextTick(() => fs.readFileSync('file'));
}
x();
console.log('...');
// <-- it blocks here
// (end of file)
它实际上并没有阻止文件的最后一行,但它或多或少会发生什么 - 你的代码将继续运行,一旦没有更多的代码运行和下一个滴答可以启动事件循环,您的进程将阻止该函数,并且在fs.readFileSync()
返回之前无法执行任何操作。
process.nextTick()
永远不是阻止代码的解决方案。在某些你希望保持执行顺序一致的情况下,非阻塞代码会很有帮助,但是阻塞代码的解决方案不是使用nextTick
而是避免阻塞函数(比如&#34) ;完全同步&#34;来自fs
)。
事实上,唯一可以使用阻塞函数的地方(如readFileSync()
或require()
)位于事件循环的第一个刻度上 - 使用nextTick()
保证你没有在第一次打勾时运行它们。