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 吗请高手支教


8 回复

当然可以。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’); });

可能上面那个例子不太好,看下面这个:

function somethingComplicated() {
	setTimeout(function () {
		console.log('doing');
	}, 1000);
}

function doSomething(callback) { somethingComplicated(); process.nextTick(callback); }

console.log(‘before doing’);

doSomething(function () { console.log(‘done’); });

执行doSomething的时候不会等somethingComplicated执行完成才返回,而是会立刻调用callback

process.nextTick()

指的是将当前的处理放置到队尾去,为防止某些进程执行的时间太长 队列是指:当前NodeJS线程处理队列

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)可以继续处理。

回到顶部