1

mocha テストで 2 つの 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 関数を使用してそれらを db に永続化したい場合、これを実行しようとすると次のエラーが発生します。

TypeError: Cannot read property 'save' of undefined

async.list の 2 つの関数を say に置き換えるとしたら

console.log
console.log

コードは正常に実行されます...また、2つのオブジェクトを async.list 関数の外に保存する場合

obj1.save()
obj2.save()

これもエラーなしで正常に実行されます。

私は困惑しています。

4

1 に答える 1

2

save関数が予期されるコンテキスト ( ) で呼び出されていないことが原因である可能性がありますthis

のような「メソッド」を渡すと、(または)へのリンクがなく、それ自体へobj1.saveの参照async.list()のみが取得されます。次のようになります。functionobj1obj2

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

固定コンテキストで渡すには、次のいずれかを実行できますbind

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

または、追加の関数を使用して、メンバー operatorの後に呼び出されるようにします。

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