q node.js,猫鼬的“帖子”之后的回调[重复]

Posted

技术标签:

【中文标题】q node.js,猫鼬的“帖子”之后的回调[重复]【英文标题】:q node.js, callback after mongoose's "post" [duplicate] 【发布时间】: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”?

非常感谢

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

【问题讨论】:

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

【讨论】:

以上是关于q node.js,猫鼬的“帖子”之后的回调[重复]的主要内容,如果未能解决你的问题,请参考以下文章

本地护照和本地护照猫鼬的身份验证错误

Node js,使用带有Q promise的mongoose不会调用reject函数

带有猫鼬的打字稿:无法读取未定义的属性“CasterConstructor”

使用猫鼬的收集计数[重复]

Node.js UnhandledPromiseRejectionWarning 即使在捕获它之后

测试时出现“mpromise(猫鼬的默认承诺库)已弃用”错误[重复]