q node.js,mongoose" s" post"之后的回调

时间:2014-06-30 18:19:11

标签: node.js mongoose promise q

我有这个源代码:

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

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

然后在之前调用" doSomethingAsync"呼叫是回叫。这怎么可能?! 我怎么称呼"然后"在完成所有保存工作之后?

非常感谢

编辑: 这两个函数在不同的文件中,没有办法也不打算使用全局变量。

1 个答案:

答案 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', ...作为携带流量变量的事件总线。除了使用自定义事件总线,或者进行一些重构以便您可以传递承诺引用之外,我没有看到您的编辑的任何直接答案。