2017-02-17 22 views
5

ノードの学習を試みています。ノード/モンゴでの理解の理解

  • が同期findまたは非同期である:私は2つの質問を持っている(公式MongoDBはNode.jsのドライバに基づいて)このコード

    // Retrieve all the documents in the collection 
        collection.find().toArray(function(err, documents) { 
        assert.equal(1, documents.length); 
        assert.deepEqual([1, 2, 3], documents[0].b); 
    
        db.close(); 
        }); 
    

    を検討 ?

  • それが非同期である場合には、.toArray関数呼び出しが私を混乱さ、通常、私は

    collection.find(function(err, results){}); 
    

の線に沿って何かを期待するので、具体的に、私はあなたが呼び出すことができますどのようなメカニズム興味を持っています.toArray on 非同期機能の結果?私が得る非同期関数はめったに何も返しません(私は約束を除いて考える)、むしろそれらに渡されたコールバックを呼び出します。誰かが見つけて.toArrayとこの状況を明確にすることはできますか?この質問の受け入れ答えで例えば


How to get a callback on MongoDB collection.find()、あなたは著者は、私が想定道findを呼び出し、コールバック関数でcursorを受け取っ見ることができます。それは私とうまくいく、それは私がそれが働くことを期待した方法です。 非同期呼び出しfindの結果(非同期の場合)toArrayと少し混乱します。

私の推測はfindです。実際のデータが到着したときにのみ、toArrayと呼んだときに限り、この種のデータはDBからロードされていません。私は正しい?

+0

この混乱はAPIの変更によるものでしょうか? v2.2の 'find'は、さまざまなメソッド(' toArray'のうちの一つ)である 'Cursor'を返します。 v1.4では、 'find'はいくつかの引数を受け取り、そのうちの1つはオプションの' callback'です(まだ 'cursor'を返しています)。 – forrert

+0

@forrert yep、それも混乱の要因でした。したがって、2.2ではfindはカーソルオブジェクトを同期的に返しますか? –

+0

以下の答えがきちんと指摘されているので、どちらの場合もカーソルが同期して返されます。非同期に何かを実行する関数は、何か(たとえばカーソル)を返すことができることに注意してください。また、カーソル関数は、コールバックがクエリの結果を受け取ることを期待しています。 – forrert

答えて

5

私はあなたを認めますが、この場合は少し奇妙です。ここでは、mongodb-nativeのv2.2です。

まず、findtwo different usagesです。コールバック関数を与えるかどうかを指定できます。しかし、の場合、の場合はと同時にを返します。より正確にはcursorです。 コールバックを渡すときには非同期のメカニズムが必要ですが、ここではできません。一方

collection.find({ }, function (err, cursor) { 
    assert(!err); 
}); 
console.log('This happens after collection.find({ }, callback)'); 

OR

const cursor = collection.find({}); 
console.log('Also happening after'); 

toArrayは、非同期関数であり、2つの異なる用途を有します。今回は、返されるオブジェクトは引数によって異なります。

は等価である:最初のコールで

cursor.toArray(function (err, documents) { 
    assert.equal(1, documents.length); 
}); 

AND

cursor.toArray() 
    .then(documents => { 
    assert.equal(1, documents.length); 
    }); 

toArray戻りundefined第二に、それはPromiseを返し、一方。