FAIL: col.insert({}, cb) vs SUCCESS col.insert({}, () => cb())



正在查找解释。尝试了没有脂肪箭头的变体,结果相同。使用

"mongodb":"^2.2.24",

以下代码不起作用(我稍后加载值,但它们不在那里(

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)
},

但这个代码确实有效:

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:的请求调用堆栈(使用实验室作为测试库(

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);
});

我能想到的唯一解释是collection.insert用一个truthy参数调用它的回调;即,如果我们假定nodeback约定,则会导致错误。

因此,您的测试失败是意料之中的。

那么,为什么其他两个代码"有效"呢?

  • 在第二个代码段中,() => { cb1(); }作为insert的回调(隐式?(会忽略错误,无论是否使用错误调用它,它都不会向cb1传递任何信息
  • 在第三个代码段中,async.each将失败(正确(并调用其回调() => { setTimeout(function(){cb()}, 10); },并返回错误-wcih再次隐式忽略它,并且从不将它传递给cb。超时是不必要的,each(…, () => cb())也会有同样的结果

最新更新