当process.nextTick
函数已经在process.nextTick
中时,是否需要从start
调用start function?我想让accept
和start
函数都是异步的?实现这一目标的理想方法应该是什么?
function accept() { // ACCEPT FUNCTION
process.nextTick(() => {
start(); // START CALL
});
}
function start() { // START FUNCTION
process.nextTick(() => {
startPolling();
});
}
发布于 2017-01-26 10:28:36
不是的。如果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
,而是完全避免阻塞函数(如fs
中的“同步”函数)。
事实上,您唯一应该使用阻塞函数(如readFileSync()
或require()
)的地方是在事件循环的第一个节拍-并且使用nextTick()
可以保证您不会在第一个节拍运行它们。
https://stackoverflow.com/questions/41869323
复制相似问题