0

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

我的代码看起来是什么样的示例:

工人

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

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

架构

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

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

4

1 回答 1

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的人将能够知道内部保存方法何时完成。

于 2013-01-08T20:16:15.377 回答