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

时间:2017-08-29 18:54:24

标签: javascript mongodb async.js

寻找解释。尝试没有脂肪箭头的变化,相同的结果。 使用

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

1 个答案:

答案 0 :(得分:0)

我能想出的唯一解释是collection.insert用一个真实的论点来调用它的回调;即如果我们采用nodeback惯例,它会导致错误。

因此,您的测试失败是预期

那么为什么其他两个代码"工作"?

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