【问题标题】:Getting a function to wait for a post middleware save to finish before continuing在继续之前获取等待中间件后保存完成的功能
【发布时间】:2017-08-01 21:40:03
【问题描述】:

这是我的问题,我有一个正在运行的工作人员收集一些数据,然后将其保存到模式中。在这些模式中,我发布了保存时发生的中间件功能。问题是我的工作人员没有等待后中间件完成工作,然后再循环并再次保存到相同的模式。随着我的工作人员继续运行,它会大大减慢速度,因为它会在完成之前一遍又一遍地排队这些功能。那些 post 中间件函数也保存到其他也执行自己的 post 函数的模式。所以正如我所知,当我正在处理数十万个正在保存的对象时,它开始真正放慢速度。

我的代码是什么样子的示例:

工人

tranFunc = (stuff, Object) -> 
            newObject = Object
            newObject = new Object newObject
            newObject.save (err) ->

Save 现在跳转到发生更多事情的架构中,但我的工作人员在完成之前循环并继续进行

架构

ObjectSchema.post("save", function() {
 DOING STUFF

我读到我可以使用 next() 之类的东西作为对工作人员的回调,但我尝试使用它没有成功。

【问题讨论】:

  • 您可以尝试发布一个“最小可运行”示例吗?我认为您需要做的是确保您的所有异步代码都接受返回回调,但我不知道您的示例中的内容是什么,所以我不知道您需要在哪里添加回调。
  • 嗯,这就是我不知道如何进行回叫的问题,所以工作人员知道我的架构已经完成......我的架构是一个单独的地方......它没有嵌套在工作人员中以防万一你怎么想...
  • 我还是试着给出答案,看看是否有意义。

标签: javascript node.js mongodb callback database


【解决方案1】:

我认为我无法以目前的形式回答这个问题,但基本的想法是

  1. 异步函数在完成时应使用回调进行通信
  2. 调用异步代码的函数本身就是异步的。

因此,在您的情况下,工作函数似乎违反了这一原则,因为它调用异步函数而不是异步函数本身。您可以通过添加返回回调作为参数并在所有操作完成后调用所述 callbabk 来解决此问题(即,在您调用的最后一个异步方法的回调中)

//sort of like this:
tranFunc = (stuff, Object, doneCb) -> 
        newObject = Object
        newObject = new Object newObject
        newObject.save (err) ->
            doneCb( /*put return values here as appropriate*/ )

现在调用tranFunc 的人将能够知道内部保存方法何时完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    相关资源
    最近更新 更多