2017-05-23 33 views
0

經過一些調查網上,好像Javascirpt的forEach循環阻塞,但我下面的代碼,否則證明:問題的JavaScript的foreach異步行爲

我使用節點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 

爲什麼循環表現得好像不是阻塞?

+0

是'documents'只是一個普通的JavaScript數組?還是更奇特的東西? –

+0

請參閱:https://stackoverflow.com/a/11661778/1623249。 '文件'實際上可能是一個'cursor',而不是一個數組 –

+2

如果這實際上是本地驅動程序,並且不是貓鼬,那麼通過'.find().toArray(err,documents)'得到您期望的行爲。在'.toArray()'返回一個常規數組之後,你有一個普通的JavaScript'.forEach()' –

回答

1

Javascript的Array.prototype.forEach是同步的(「阻塞」),是的。但Mongo的Collection.find返回一個Cursor,其.forEach方法是異步和基於回調的。 Cursor.forEach接受回調一旦你遍歷所有結果被稱爲:

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