process.nextTick()的使用方法
发布于 2年前 作者 aarontang 2037 次浏览
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 吗请高手支教

6 回复

上面是同步代码,下面是异步代码。运行一下下面这个例子应该就清楚了。

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,代码如下:

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();

回到顶部