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()
  })
})

在第二种情况下,我认为你有点离题了。您不能通过参数将值从一个中间件函数传递到下一个函数。当您使用中间件的双参数回调版本时,您将其标记为并行中间件,第二个参数是done回调完成处理后必须调用的函数。

于 2012-09-07T23:00:27.430 回答