场景如下
场景#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不起作用。
答案 0 :(得分:2)
在第一个场景中,您需要捕获要为回调提供的原始this
上下文,如下所示:
someSchema.pre('save', function(next){
var self = this;
asyncFunction(function(){
self.sub.value = 'something'
next()
})
})
在第二种情况下,我认为你在杂草中有点不对劲。您不能通过参数将值从一个中间件函数传递到下一个。当您使用middleware的两个参数回调版本时,您将其标记为并行中间件,第二个参数是在回调完成后必须调用的done
函数。