2014-06-30 75 views
0

我有这个源代码:q node.js中,后回调猫鼬的“后”

UserSchema.post('save', function (next) { 
    doSomethingAsync(function(){ 
     next() 
    }); 
}); 

myFunc = function(user){ 
    Q.ninvoke(user, 'save').then(function(){ 
      doThisAtTheEnd() 
    }); 
} 

但后来被称为前“doSomethingAsync”要求是回调。这怎么可能?! 在完成所有保存工作后,我怎样才能调用“then”?

非常感谢

编辑: 的两个功能是在不同的文件,没办法,也不打算使用全局变量。

回答

0

从Q.ninvoke的文档:https://github.com/kriskowal/q/wiki/API-Reference#qninvokeobject-methodname-args

调用一个Node.js的风格的方法与给定的可变参数, 返回如果方法调用背部采用了 结果已成立的承诺,或者拒绝,如果它有一个错误回调(或抛出一个 同步)

和(“拯救”)看着猫鼬schema.post:http://mongoosejs.com/docs/middleware.html

后中间件在挂钩方法及其所有 前中间件完成后执行。后置中间件不直接接收流量控制,例如 。没有下一个或完成的回调传递给它。后 挂钩是注册这些方法的传统事件侦听器的方法。

这意味着在doSomethingAsync中没有接下来的呼叫。可能有些东西在内部回拨到ninvoke中。

出票人怎么样?您可以生成一个出价者并解决它。即:问题编辑后

var saveDeferer = Q.defer(); 

UserSchema.post('save', function (next) { 
    doSomethingAsync(function(){ 
     saveDeferer.resolve(); 
    }); 
}); 

saveDeferer.promise.then(function() { doSomething(); }); 

更新:

在我看来,你要使用schema.post('save', ...作为各地进行流动变量的eventbus。除了使用自定义事件总线之外,我没有看到任何直接的编辑答案,或者做一些重构,以便可以传递约定引用。