-1

nodejs中的异步进程是什么?看看我的测试。

+ Person.find(): query on database, it will take time
+ while(): delay for 5s

控制台中的结果如下:

the first:  Listening on port 3000
the second: Wait
----third:  0
---------:  4
---------:  2
---------:  2
---------:  3
---------:  1
---------:  1

如果我们说这是异步过程,为什么程序在运行console.log('0')和console.log('4')之前的5s内停止在while()函数?

var Product = mongoose.model('Product', ProductSchema);
var myObject = new Object();

Person.find().exec(function (err, docs) {

    for (var i=0;i<docs.length;i++)
    { 
        Product.find({ user: docs[i]._id},function (err, pers) {
             myObject[i] = pers;
             console.log('1'); 
            });
        console.log('2'); 
    }
    console.log('3'); 
});
console.log('Listening on port 3000'); 
var startTime = new Date().getTime();
console.log('wait');
while (new Date().getTime() < startTime + 5000); //the program stop here for 5s before priting 
console.log('0');                                //console.log('0') and console.log('4');

app.listen(3000);
console.log('4');
4

2 回答 2

0

Node 在一个进程上工作,除了能够将一些异步处理移交给本机代码。这些通常是 I/O 调用,例如网络和数据库访问。

你的while (new Date().getTime() < startTime + 5000);意志挡住了。但是,看看你的Product.find()电话。你传给它一个回调函数。使用回调函数的代码是异步的,并且会在 I/O 完成时通知您。

于 2013-09-25T03:36:43.220 回答
0

您获得此执行顺序的原因是因为您显示的唯一异步函数是Person.find().exec()and Product.find()

你看到的顺序是这样的:

  1. 您的变量实例化是同步的。
  2. Person.find().exec()是异步的,不会阻塞主线程。
  3. 主线程没有被阻塞,所以console.log('Listening on port 3000')运行。
  4. console.log()是同步的,所以var startTime设置。
  5. console.log('wait');是同步的并在执行后继续。
  6. while()循环运行。它阻塞了主线程。
  7. 事件循环继续,正在运行console.log('0');
  8. listen()console.log('4')函数都是同步运行的。
  9. Person.find().exec()finally 运行并开始for循环。
  10. for循环也是。在继续之前完成所有迭代。
  11. 由于循环已停止阻塞主线程,console.log('3')因此正在运行。
  12. 循环内异步函数的回调执行。

总而言之,您的程序在while()循环处停止,因为循环被阻塞了。如果要延迟代码的执行,请使用以下全局计时器函数之一来执行此操作,而不要阻塞主线程:

setTimeout(function() {
  console.log('0');

  app.listen(3000);
  console.log('4');
}, 5000);
于 2013-09-25T03:39:03.897 回答