我有这个源代码:
UserSchema.post('save', function (next) {
doSomethingAsync(function(){
next()
});
});
myFunc = function(user){
Q.ninvoke(user, 'save').then(function(){
doThisAtTheEnd()
});
}
然后在之前调用" doSomethingAsync"呼叫是回叫。这怎么可能?! 我怎么称呼"然后"在完成所有保存工作之后?
非常感谢
编辑: 这两个函数在不同的文件中,没有办法也不打算使用全局变量。
答案 0 :(得分:0)
来自Q.ninvoke的文档:https://github.com/kriskowal/q/wiki/API-Reference#qninvokeobject-methodname-args
使用给定的可变参数调用Node.js样式方法, 如果方法使用a回调,则返回已履行的promise 结果,如果它回调错误(或抛出一个错误),则拒绝 同步地)
查看mongoose schema.post(' save'):http://mongoosejs.com/docs/middleware.html
post中间件是在hooked方法之后执行的 预中间件已经完成。发布中间件不直接接收 流量控制,例如没有下一个或完成的回调传递给它。岗位 钩子是一种为这些注册传统事件监听器的方法 方法
这意味着您无需在doSomethingAsync中调用。可能有些东西在内部回调到ninvoke。
deferers怎么样?您可以生成一个deferer并解决它。即:
var saveDeferer = Q.defer();
UserSchema.post('save', function (next) {
doSomethingAsync(function(){
saveDeferer.resolve();
});
});
saveDeferer.promise.then( function() { doSomething(); } );
编辑问题后更新:
在我看来,您正在尝试使用schema.post('save', ...
作为携带流量变量的事件总线。除了使用自定义事件总线,或者进行一些重构以便您可以传递承诺引用之外,我没有看到您的编辑的任何直接答案。