关注此链接http://greenash.net.au/thoughts/2012/11/nodejs-itself-is-blocking-only-its-io-is-non-blocking/我正在尝试编写两个非阻塞函数:
阻止代码:
function LongBucle() {
for (x=0;x<=10000;x++) {
console.log(x);
}
}
function ShortBucle() {
for (x=0;x<=10;x++) {
console.log("short "+x);
}
}
LongBucle();
console.log("Long bucle end");
ShortBucle();
console.log("Short bucle end");
现在我尝试将代码转换为非阻塞代码,以便 “console.log(”Short bucle end“);”应该先显示?
function ShortBucle(callback) {
for (x=0;x<=10;x++) {
console.log("corto "+x);
}
callback(x);
}
function LongBucle(callback) {
for (x=0;x<=10000;x++) {
console.log(x);
}
callback(x);
}
LongBucle(function(err) {
console.log('Long bucle end');
});
ShortBucle(function(err) {
console.log('short bucle end');
});
但它不起作用。我做错了什么?
答案 0 :(得分:1)
添加回调不会使您的代码异步。由于Javascript是单线程语言,因此在给定时间只执行一条指令。这意味着无论您做什么,此片段都会永久挂起:
function a() {
while (true) {}
}
a();
console.log('Done.');
要稍后处理一些代码(即异步),您可以使用process.nexTick()
或setImmediate
:
function LongBucle(callback) {
setImmediate(function() {
for (x=0;x<=10000;x++) {
console.log(x);
}
callback(x);
})
}
Here is an article解释process.nextTick()
和Javascript中的事件循环。