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 吗请高手支教
上面是同步代码,下面是异步代码。运行一下下面这个例子应该就清楚了。
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>
@syndim 但我不用process.nextTick,直接callback()也是直接调用了