2017-08-29 9 views
2

説明を探しています。太い矢印を使わずに試したバリエーション、同じ結果。 "^ 2.2.24"、FAIL:col.insert({}、cb)vs SUCCESS col.insert({}、()=> cb())

次のコードは動作しません(私は後で値をロードして、彼らはそこじゃない)

addCollections(data, cb) { 
    var names = Object.keys(data); 
    async.each(names, (name, cb1) => { 
     db.createCollection(name).then((collection) => { 
      collection.insert(data[name], cb1); 
     }).catch(cb1); 
    }, cb) 
}, 

が、この:

"MongoDBのを" 使用 コード仕事ん:以下も

addCollections(data, cb) { 
    var names = Object.keys(data); 
    async.each(names, (name, cb1) => { 
     db.createCollection(name).then((collection) => { 
      collection.insert(data[name], (a, b) => { 
       // reverted this comment bc Im debugging this 
       cb1(); 
      }) 
     }).catch(cb1); 
    }, cb); 
}, 

作品:

addCollections(data, cb) { 
    var names = Object.keys(data); 
    async.each(names, (name, cb1) => { 
     db.createCollection(name).then((collection) => { 
      collection.insert(data[name], cb1); 
     }).catch(cb1); 
    },() => { 
     setTimeout(function() { 
      cb() 
     }, 10); 
    }) 
}, 
@Adamによって要求されるように(テスト用LIBとしてラボを使用して)

コールスタック:

execute(fixture, verify, cb) { 
    db.connect(() => { 
     db.drop(() => { 
      db.addCollections(fixture,() => { 
       this.executeNode(fixture, verify, cb); 
      }); 
     }); 
    }); 
}, 

executeNode(fixture, verify, cb) { 
    var injectOptions = { 
     method: 'GET', 
     url: 'myUrl 
    }; 

    server.inject(injectOptions, function (response) { 
     verify(response.result); 
     db.close(cb); 
    }); 
}, 

test('default', (done) => { 
    fb.execute(fixture, verify, done); 
}); 
+2

約束事を 'async.js'と一緒に使用しないでください。 – Bergi

+0

最初は正しいはずです。どのように呼び出すか、エラーを処理する方法を教えてください。 – Bergi

+0

私は不思議です、なぜ非同期の約束はありませんか? – icetbr

答えて

0

私が思い付くことができる唯一の説明はcollection.insertがtruthy引数でそのコールバックを呼び出すことです。すなわち、ノードバックの規約を仮定すると、エラーになる。

あなたのテストが失敗しているのは、です。です。

なぜ、他の2つのコードがなぜ「機能する」のですか? insertのコールバックとして第2のスニペットで

  • () => { cb1(); }は(暗黙的に?)にかかわらず、それが1で呼び出されているかどうか、それはcb1に何かを渡すことはありません、エラーを無視します。
  • 3番目のスニペットでは、async.eachが失敗し(正しく)、そのコールバック() => { setTimeout(function(){cb()}, 10); }をエラーとともに暗黙的に無視し、それをcbに渡すことはありません。このためにタイムアウトは不要ですが、each(…,() => cb())は同じ結果を得ています。
+0

あなたは正しいです。 'data'はオブジェクトのリストであり、それぞれはコレクション(オブジェクトの配列)を表します。いくつかの 'コレクション'は空で、insert([])はエラーを返します。私のアプリケーションには無関係だったので、他の例もうまくいきました。 'db.addCollections(fixture、()=> {'これはエラーをキャッチする場所です。 – icetbr

関連する問題