【问题标题】:Vows with Async nested topics - scope problem带有异步嵌套主题的誓言 - 范围问题
【发布时间】:2011-09-27 01:32:21
【问题描述】:

我希望我的誓言可以访问我的主题中的 outerDocs 和 innerDocs,但它没有。

'ASYNC TOPIC': {
  topic: function() {
    aModel.find({}, this.callback);
  },
  'NESTED ASYNC TOPIC': {
    topic: function(outerDocs) {
      anotherModel.find({}, this.callback(null, innerDocs, outerDocs));
    },
    'SHOULD HAVE ACCESS TO BOTH SETS OF DOCS': function(err, innerDocs, outerDocs) {
      console.log(err, innerDocs, outerDocs);
      return assert.equal(1, 1);
    }
  }

我做错了什么?

【问题讨论】:

  • What am I doing wrong?:首先,您将此问题标记为 Java 问题,但实际上并非如此。您了解 Java 和 Javascript 的关系就像 ham 与 hamster 的关系一样密切。

标签: javascript node.js vows


【解决方案1】:

你不能像这样为回调设置参数,find 函数会自己做。改为这样做:

topic: function(outerDocs) {
  var self = this;
  anotherModel.find({}, function(err, docs) {
    self.callback(err, docs, outerDocs);
  });
},

【讨论】:

  • 当我阅读它时认为这会起作用,但 Vows 似乎不支持以这种方式处理回调。 (仅测试没有错误消息的炸弹。)文档中有类似的同步示例(将参数添加到 this.callback 等),但同步示例似乎没有直接操纵回调的参数。不知道为什么。
  • 对于遇到此问题的任何人,您都可以使用 ECMA 5 的绑定方法解决此问题。所以你可以这样做: anotherModel.find({}, this.callback.bind(this, null, outerDocs) 然后在你的誓言中: function (_, outerDocs, err, innerDocs) 等。 Bind 预先添加额外的参数,所以它们有从头开始。
  • 如果您的测试只是轰炸而没有错误消息,我认为您会遇到不同的问题。我在整个代码库中都使用了这种特定模式,没有任何崩溃。
猜你喜欢
  • 1970-01-01
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 2018-10-28
相关资源
最近更新 更多