寻找解释。尝试没有脂肪箭头的变化,相同的结果。 使用
“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);
});
答案 0 :(得分:0)
我能想出的唯一解释是collection.insert
用一个真实的论点来调用它的回调;即如果我们采用nodeback惯例,它会导致错误。
因此,您的测试失败是预期。
那么为什么其他两个代码"工作"?
() => { cb1(); }
作为insert
的回调(隐式地?)忽略错误,无论是否使用它调用它都不会将任何内容传递给cb1
。async.each
将失败(正确)并使用错误调用其回调() => { setTimeout(function(){cb()}, 10); }
- 再次隐式忽略它并且从不将其传递给cb
。此时不需要超时,each(…, () => cb())
会产生相同的结果。