这是我的问题,我有一个工人运行,收集一些数据,然后将其保存到一个模式。在这些模式中,我有post中间件功能,发生在保存。问题是,我的worker在循环并再次保存到相同的模式之前没有等待post中间件完成工作。当我的worker继续运行时,它会大大减慢速度,因为它在完成之前会一次又一次地将这些函数排队。这些发布中间件函数还保存到其他模式中,这些模式也执行自己的发布函数。因此,正如你所看到的,当我处理成千上万个被保存的对象时,它开始变得很慢。
我的代码看起来像的例子:<标题>工人h1> Save现在跳转到模式中,那里发生了更多的事情,但是我的worker在完成之前循环并继续运行 <标题> 模式ObjectSchema.post("save", function() {
DOING STUFF
我读到我可能会使用像next()
这样的东西作为工人的回调,但我尝试使用它是不成功的。
我想我不能以目前的形式回答这个问题,但基本的想法是
- 异步函数应该使用回调来通信当他们完成 调用异步代码的函数本身是异步的。
所以在你的例子中,看起来工作函数违反了这个原则,因为它调用了一个async函数,而它本身不是async的。您可以通过添加一个返回回调作为参数并在所有操作完成后(即在您调用的最后一个异步方法的回调中)调用所述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
的人将能够知道内部保存方法何时完成。