0

シナリオは次のとおりです

シナリオ#1

someSchema.pre('save', function(next){
  asyncFunction(function(){
    this.sub.value = 'something'
    next()
  })
})

これはコンテキストを変更し、asyncFunctionを表すため失敗します。そのため、関数内の受信データを変更できません。this.subが定義されていないというエラーが発生します

シナリオ#2、hooks-jsからの情報に基づく

some.Schema.pre('save', function(next){
  asyncFunction(function(){
    next('something')
  });
});
some.Schema.pre('save', function(next, value){
  this.sub.value=value
  next()
})

これは、値を変更する限り機能し、mongodb側は問題ありませんが、ハングするだけで、ドキュメントを保存した後は続行されません。

私は何か間違ったことをしていますか?これを行うためのより良い方法はありますか?それともこれはバグですか

シナリオ#3は元々失敗しましたが、現在は機能しているようです

someSchema.pre('save', function(next){
  x = this
  asyncFunction(function(){
    x.sub.value = 'something'
    next()
  })
})

とはいえ、シナリオ#2が機能しなかった理由についてはまだ興味があります。

4

1 に答える 1

2

this最初のシナリオでは、次のようにコールバックで使用できるようにする元のコンテキストをキャプチャする必要があります。

someSchema.pre('save', function(next){
  var self = this;
  asyncFunction(function(){
    self.sub.value = 'something'
    next()
  })
})

2番目のシナリオでは、雑草が少し離れていると思います。パラメータを介して、あるミドルウェア関数から次のミドルウェア関数に値を渡すことはできません。ミドルウェアの2つのパラメーターのコールバックバージョンを使用する場合、それを並列ミドルウェアとしてマークします。2番目のパラメーターはdone、コールバックが処理を完了したときに呼び出す必要のある関数です。

于 2012-09-07T23:00:27.430 に答える