0

これが私の問題です。データを収集してスキーマに保存するワーカーが1つ実行されています。これらのスキーマには、保存時に発生するポスト ミドルウェア関数があります。問題は、ポスト ミドルウェアがループして同じスキーマに再度保存される前に、ワーカーがポスト ミドルウェアの動作が完了するのを待たないことです。私のワーカーが実行を続けると、これが完了する前にこれらの機能を何度もキューに入れるため、大幅に遅くなります。これらのポスト ミドルウェア関数は、独自のポスト関数も実行する他のスキーマにも保存されます。保存されている何十万ものオブジェクトを扱っているため、非常に遅くなり始めていることがわかります。

私のコードの種類がどのように見えるかの例:

ワーカー

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

保存はスキーマにジャンプして、さらに何かが発生しますが、ワーカーはそれが完了する前にループし、続行します

スキーマ

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

next()ワーカーへのコールバックとして a のようなものを使用できる可能性があることを読みましたが、それを使用しようとしても成功しませんでした。

4

1 に答える 1

1

この質問に現在の形で答えられるとは思いませんが、基本的な考え方は

  1. 非同期関数は、完了時にコールバックを使用して通信する必要があります
  2. 非同期コードを呼び出す関数は、それ自体が非同期です。

したがって、あなたの場合、ワーカー関数は非同期でなく非同期関数を呼び出すため、この原則に違反しているように見えます。return コールバックをパラメーターとして追加し、すべてが完了した後に (つまり、最後に呼び出した非同期メソッドのコールバック内で) 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、内側の save メソッドがいつ終了したかを知ることができます。

于 2013-01-08T20:16:15.377 に答える