【问题标题】:q node.js, callback after mongoose's "post" [duplicate]q node.js,猫鼬的“帖子”之后的回调[重复]
【发布时间】:2014-08-21 04:45:23
【问题描述】:

我有这个源代码:

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

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

但是 then 在 "doSomethingAsync" 调用之前调用是回调。这怎么可能?! 完成所有保存内容后,我如何调用“then”?

非常感谢

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

【问题讨论】:

    标签: node.js mongoose promise q


    【解决方案1】:

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

    使用给定的可变参数调用 Node.js 风格的方法, 如果方法用 a 回调,则返回一个已履行的承诺 结果,或者如果它以错误回调(或抛出一个 同步)

    然后查看 mongoose schema.post('save'):http://mongoosejs.com/docs/middleware.html

    post 中间件在被钩子方法和它所有的方法之后执行 预中间件已经完成。 post中间件不直接接收 流量控制,例如没有 next 或 done 回调传递给它。邮政 钩子是一种为这些注册传统事件侦听器的方法 方法。

    这意味着在 doSomethingAsync 中没有下一个供您调用。可能有什么在内部调用了 ninvoke。

    延迟者怎么样?您可以生成延迟器并解决它。即:

    var saveDeferer = Q.defer();
    
    UserSchema.post('save', function (next) {
        doSomethingAsync(function(){
            saveDeferer.resolve();
        });
    });
    
    saveDeferer.promise.then( function() { doSomething(); } );
    

    问题编辑后更新:

    在我看来,您正在尝试将schema.post('save', ... 用作携带流变量的事件总线。除了使用自定义事件总线或进行一些重构以便您可以传递承诺引用之外,我没有看到任何直接回答您的编辑。

    【讨论】:

      猜你喜欢
      • 2019-03-17
      • 2017-07-10
      • 2020-02-02
      • 2016-12-12
      • 2012-12-14
      • 2016-06-20
      • 1970-01-01
      • 2019-09-16
      • 1970-01-01
      相关资源
      最近更新 更多