使用Javascript foreach异步行为的问题

时间:2017-05-23 02:31:14

标签: javascript node.js mongodb foreach

经过网上的一些研究后,似乎Javascirpt的forEach循环阻塞了,但我的下面的代码证明了这一点:

我正在使用node js mongoDB驱动程序从我的集合中获取文档,这是一个数组(命名文档)

 collectionInstance.find({}, function(err, documents) {
      if (err || !documents) {
        console.log('no documents found in the collection');
      } else {

        console.log('before');

        documents.forEach(function(document) {
          console.log('inside')
        });

        console.log('outside');


      }
    });

我想要的是什么:

before -> inside, inside, inside .... inside -> outside

它给了我什么:

before -> outside -> inside, inside, inside .... inside 

为什么循环表现得像是非阻塞?

1 个答案:

答案 0 :(得分:1)

Javascript的Array.prototype.forEach是同步的(“阻止”),是的。但是Mongo的Collection.find返回Cursor,其.forEach方法是异步的,基于回调。 Cursor.forEach接受第二个回调,在您迭代所有结果后调用该回调:

documents.forEach(function (document) {
  console.log('inside');
}, function () {
  console.log('outside');
});