【问题标题】:FAIL: col.insert({}, cb) vs SUCCESS col.insert({}, () => cb())失败:col.insert({}, cb) 与成功 col.insert({}, () => cb())
【发布时间】:2017-08-31 02:24:01
【问题描述】:

寻求解释。尝试了没有粗箭头的变化,结果相同。 使用

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

【问题讨论】:

  • 不要和async.js一起使用promises
  • 第一个确实应该是正确的。你能告诉我们你是如何调用它并处理错误的吗?
  • 我很好奇,为什么没有异步承诺?
  • 因为它们是不同的接口,很难在没有错误的情况下组合。您的代码中有这么多回调,真的很难查看其中哪些使用 nodeback 约定(采用错误和结果参数)。

标签: javascript mongodb async.js


【解决方案1】:

我能想到的唯一解释是collection.insert 用一个真实的参数调用它的回调;也就是说,如果我们假设 nodeback 约定,它会导致错误。

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

那么为什么其他两个代码“有效”?

  • 在第二个 sn-p 中,() => { cb1(); } 作为 insert 的回调(隐式?)忽略错误,无论是否使用它调用它都不会向 cb1 传递任何内容。
  • 在第三个 sn-p 中,async.each 将失败(正确)并调用它的回调 () => { setTimeout(function(){cb()}, 10); } 并返回错误 - 再次隐式忽略它并且永远不会将它传递给 cb。超时是不必要的,each(…, () => cb()) 会得到相同的结果。

【讨论】:

  • 你是对的。 data 是一个对象列表,每个对象代表一个集合(对象数组)。一些“集合”是空的,并且 insert([]) 返回错误。它与我的应用程序无关,因此其他示例运行良好。 db.addCollections(fixture, () => { 这是我应该发现错误的地方。忘记处理它是我的坏事。
猜你喜欢
  • 1970-01-01
  • 2016-05-20
  • 2017-06-04
  • 2014-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-08
  • 2019-09-19
相关资源
最近更新 更多