1

我想在我的 mocha 测试中保存两个 Mongoose 对象 - 并在两者都成功时收到通知。我正在使用 asyncjs 库来实现这一点。

beforeEach (done) ->

  obj1 = new Person({ name: 'Jon' })
  obj2 = new Person({ name: 'Dan' })

  console.log obj1   # ... { name: 'Jon', _id: 4534534543512 }

  async.list([
    obj1.save
    obj2.save
  ]).call().end( (err, res) ->
    return done(err) if err
    done()
  )

您可以在 console.log 中看到 obj1 被设置为 MongoDB 文档 - 但是当我想使用 save 函数将它们持久保存到数据库时,尝试执行此操作时出现以下错误:

TypeError: Cannot read property 'save' of undefined

如果我用 say 替换 async.list 中的两个函数

console.log
console.log

代码执行得很好......另外,如果我像这样将两个对象保存在 async.list 函数之外

obj1.save()
obj2.save()

它也执行得很好,没有错误。

我难住了。

4

1 回答 1

2

这可能是因为save没有使用预期的上下文 ( this) 调用函数。

当您传递类似 的“方法obj1.save时,引用async.list()仅指向function自身,没有任何返回obj1(或obj2)的链接。这将类似于:

save = obj1.save
save() # `this` is `undefined` or `global`

要使用固定上下文传递,您可以使用bind它们:

async.list([
  obj1.save.bind(obj1)
  obj2.save.bind(obj2)
]) # etc.

或者使用其他函数,以便在成员运算符之后调用它们:

async.list([
  (done) -> obj1.save(done),
  (done) -> obj2.save(done)
]) # etc.
于 2013-04-03T21:49:00.167 回答