Nodejs process.nextTick()的使用方法
Nodejs process.nextTick()的使用方法
function doSomething(args, callback) {
somethingComplicated(args); callback(); } doSomething(function onEnd() { compute(); }); 代码0
function doSomething(args, callback) {
somethingComplicated(args);
process.nextTick(callback); } doSomething(function onEnd() { compute(); }); 代码1, 请问有没有使用process.nextTick()的区别是什么。 执行的顺序不都是 compute() somethingComplicated() callback 吗请高手支教
当然可以。process.nextTick()
是 Node.js 中的一个非常有用的函数,用于将回调函数延迟到当前操作完成后立即执行。它比 setImmediate()
和 setTimeout(fn, 0)
更快,因为它会优先于 I/O 事件循环中的其他任务执行。
示例代码对比
示例代码 0
function doSomething(args, callback) {
somethingComplicated(args);
callback();
}
doSomething(function onEnd() {
compute();
});
在这个例子中,somethingComplicated(args)
函数会先执行,然后 callback()
会被立即调用,导致 compute()
在下一个事件循环周期中执行。
示例代码 1
function doSomething(args, callback) {
somethingComplicated(args);
process.nextTick(callback);
}
doSomething(function onEnd() {
compute();
});
在这个例子中,somethingComplicated(args)
仍然会先执行,但 callback()
会被推迟到当前操作完成后的下一个事件循环检查点执行。因此,compute()
会在 somethingComplicated(args)
完成后立即执行。
区别及执行顺序
- 示例代码 0:
somethingComplicated(args)
先执行,然后callback()
立即执行,导致compute()
在下一个事件循环周期中执行。 - 示例代码 1:
somethingComplicated(args)
先执行,然后callback()
被推迟到当前操作完成后的下一个事件循环检查点执行,从而确保compute()
在somethingComplicated(args)
完成后立即执行。
总结
使用 process.nextTick()
可以确保回调函数在当前操作完成后立即执行,而不是等待下一个事件循环周期。这在处理某些同步操作时特别有用,可以避免阻塞事件循环,提高程序的响应性。
希望这能帮助你理解 process.nextTick()
的使用方法及其与直接调用回调函数的区别。
上面是同步代码,下面是异步代码。运行一下下面这个例子应该就清楚了。
function doSomething(callback) {
setTimeout(function () {
console.log('doing');
}, 1000);
process.nextTick(callback);
}
console.log(‘before doing’);
doSomething(function () {
console.log(‘done’);
});
http://freewind.me/blog/20120516/926.html
这里面有描述process.nextTick()的用法
不知道是不是node更新的原因,上面的结果现在都不工作,递归的nextTick会占据所有的cpu,而不会返回event loop, 原因在
http://stackoverflow.com/questions/17502948/nexttick-vs-setimmediate-visual-explanation
上述的情况如果想在http server不block 请求的情况下能处理长时间运算的话,应该使用setImmediate,代码如下:
<code> var http = require(‘http’);
var wait = function (mils) { var now = new Date; while (new Date - now <= mils); };
function compute() { console.log(‘Start’); wait(1000); console.log(‘Works 1s’); setImmediate(compute); }
http.createServer(function (req, res) { console.log(‘new request’); res.writeHead(200, {‘Content-Type’: ‘text/plain’}); res.end(‘Hello World’); }).listen(3000, ‘127.0.0.1’);
compute(); </code>
process.nextTick()
是 Node.js 中的一个函数,它允许你在当前操作完成后但 I/O 事件触发前执行一个回调函数。这可以用于确保某些代码在当前操作完成之后立即执行,但不会阻塞其他操作。
对比您提供的两个代码片段:
代码0
function doSomething(args, callback) {
somethingComplicated(args);
callback();
}
doSomething(function onEnd() {
compute();
});
在这个例子中,somethingComplicated(args)
完成后会直接调用 callback()
,因此 compute()
将在 somethingComplicated(args)
完成后立即执行。
代码1
function doSomething(args, callback) {
somethingComplicated(args);
process.nextTick(callback);
}
doSomething(function onEnd() {
compute();
});
在这个例子中,somethingComplicated(args)
完成后,会将 callback
放入事件循环队列中等待执行。这样,compute()
将会在当前操作结束后立即执行,但会在所有其他 I/O 事件之前执行。
总结来说:
- 代码0 中的
callback()
是同步执行的。 - 代码1 中的
callback()
是异步执行的,但会在任何 I/O 操作之前执行。
这可以避免阻塞事件循环,使其他操作(如 I/O)可以继续处理。