ループ内で長時間実行されるコードブロックを待機しています

QuartzShard

そのため、ループが正しい順序で実行されていないように見える理由に頭を悩ませようとしています。これは、値の並べ替えが完了したときにワーカースレッドによって行われる呼び出しです。

worker.on('message',function(data) {
                console.log(data)
                for (var i of data.entries) { 
                    console.log(i.Email) 
                    db.rota.checkUserHasShifts(i.Email,function(flag) {
                        if (flag) {
                            console.log('e', i.Email)
                             db.rota.getShiftsForUser(i.Email,function(err, shiftData) {
                                if (!shiftData) return
                                shiftData.Shifts = i.Shifts
                                shiftData.save(function(err) {
                                    if (err) throw err;
                                })
                            })
                        } else {
                            console.log('n', i.Email)
                            var newShift = new db.rota({Email:i.Email,Shifts:i.Shifts})
                            newShift.save(function (err){
                                if (err) throw err
                            });
                        }
                    })  
                };
                console.log("Spreadsheet processed")
            })

20エントリのセットの場合、これは次のようになります。

  • {Email:"someemail",Shifts:{date:time}}配列に20個のオブジェクトがある「data」オブジェクトを出力します
  • 各メールを正しい順序で印刷します
  • 次に、リストの最後の電子メールで20ロットのdbコードを実行するとn [email protected]、コンソールに20行、データベースに20の同一のエントリが表示されます。

意図された動作は、明らかに、次のエントリに移動する前に各エントリを待機すること、または少なくともセット内の各電子メールのエントリをキューに入れることです。ループを待機させ、db.rota.checkUserHasShiftsメソッドを適切に実行し、最後のエントリだけでなくすべてのエントリに対してコールバックするにはどうすればよいですか?

パトリック・クルーグ

呼び出す前にi変数のスコープを設定する必要があります。checkUserHasShiftsそうしないとi、ループの最後の値で20回呼び出されます。

for (var i in items){
 (function(i){ db.rota.checkUserHasShifts(i)..})(i);
}

理由を理解するために、この優れた記事のセクション6「スコープの再検討」が非常に役立つことがわかりました(ただし、C#のバックグラウンドを持つ人々を対象としています)。

https://mauricebutler.wordpress.com/tag/c-javascript/

関連する引用:

JavaScriptには「ブロックスコープ」がないため、forループは新しいスコープを導入していません。これは、要素変数にアクセスするたびに、同じメモリ位置が更新されることを意味します

このSOの質問は、その効果も非常によく示しています。ループ内のJavaScriptクロージャ–簡単な実用例

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

iOSで特定の時間に実行されるのをコードブロックで待機させる

分類Dev

PHPで長時間実行されているネットワーク呼び出しは、プロセッサコアを拘束しますか?

分類Dev

Fork-Joinスレッドプールで長時間実行されているタスクがすべてのスレッドをブロックできますか?

分類Dev

PyQtアプリケーション内で長時間実行されているPythonコマンドを終了します

分類Dev

前の実行が終了するのを待っている間、ブロックをループします

分類Dev

SQL Server:長時間実行されている更新を完了する前に停止した場合、自動的にロールバックされますか?

分類Dev

長時間実行されるJavascriptループのUIをブロックする方法

分類Dev

Docker-インデックス作成スクリプトを実行する前にMongoがロードされるのを待機しています

分類Dev

ユーザーがテキストフィールドへの入力を一時停止してからコールバックを実行するまで待機するJSプラグインまたはjQuery関数を探しています

分類Dev

ターミナルで長時間実行されているプログラムを一時停止しますか?

分類Dev

ターミナルで長時間実行されているプログラムを一時停止しますか?

分類Dev

Firebase Storage-すべてのアップロードタスクが完了するまで待ってから、機能を実行してください

分類Dev

メソッドの実行中にすべてのコントローラーがロードされるのを待機しています

分類Dev

長時間実行されるネットワーク通話に適したWorkManagerを使用しています

分類Dev

長時間実行されるプロセスを待たずにメソッドを実行するにはどうすればよいですか?

分類Dev

ロックされているコードの実行は、ロックされていないコードよりも時間がかかるはずです

分類Dev

長時間実行されているJavaScriptがブラウザをロックしないようにする

分類Dev

コールバックが実行されるまで待機

分類Dev

すべてのコールバックが静的な時間なしで実行を終了するのを待っています

分類Dev

システムコールでJavaスレッドが待機/ブロックされている場合でも、Javaスレッドは実行可能であるように見えますか?

分類Dev

ループが実行されるのを待って、ノード J で値を取得しています

分類Dev

PHP ampq + rabbit MQ-長時間実行されるプロデューサー:すでに宣言されているキューにメッセージを送信できますが、新しいキューを宣言することはできません

分類Dev

非同期/ forループの待機NodeJSループの実行をブロックしていません

分類Dev

LinuxでI / Oを待機しているプロセスがブロックされている時間を確認する

分類Dev

長時間実行されているプロセスのバックグラウンド中にEXC_BAD_ACCESSを防止します

分類Dev

SwingWorkerスレッドで長時間実行されているタスクでGUIがフリーズする

分類Dev

なぜJavaはガベージコレクターを実行するのにそれほど長い時間待機するのですか?

分類Dev

スローされたfile.copy例外を実行すると、ファイルにアクセスできませんが使用されています。コードは、コンパイルされていないときにデバッグ時に機能します。

分類Dev

Github:プルリクエストがマージされるのを待っている間、新しくコミットした新機能を使用します

Related 関連記事

  1. 1

    iOSで特定の時間に実行されるのをコードブロックで待機させる

  2. 2

    PHPで長時間実行されているネットワーク呼び出しは、プロセッサコアを拘束しますか?

  3. 3

    Fork-Joinスレッドプールで長時間実行されているタスクがすべてのスレッドをブロックできますか?

  4. 4

    PyQtアプリケーション内で長時間実行されているPythonコマンドを終了します

  5. 5

    前の実行が終了するのを待っている間、ブロックをループします

  6. 6

    SQL Server:長時間実行されている更新を完了する前に停止した場合、自動的にロールバックされますか?

  7. 7

    長時間実行されるJavascriptループのUIをブロックする方法

  8. 8

    Docker-インデックス作成スクリプトを実行する前にMongoがロードされるのを待機しています

  9. 9

    ユーザーがテキストフィールドへの入力を一時停止してからコールバックを実行するまで待機するJSプラグインまたはjQuery関数を探しています

  10. 10

    ターミナルで長時間実行されているプログラムを一時停止しますか?

  11. 11

    ターミナルで長時間実行されているプログラムを一時停止しますか?

  12. 12

    Firebase Storage-すべてのアップロードタスクが完了するまで待ってから、機能を実行してください

  13. 13

    メソッドの実行中にすべてのコントローラーがロードされるのを待機しています

  14. 14

    長時間実行されるネットワーク通話に適したWorkManagerを使用しています

  15. 15

    長時間実行されるプロセスを待たずにメソッドを実行するにはどうすればよいですか?

  16. 16

    ロックされているコードの実行は、ロックされていないコードよりも時間がかかるはずです

  17. 17

    長時間実行されているJavaScriptがブラウザをロックしないようにする

  18. 18

    コールバックが実行されるまで待機

  19. 19

    すべてのコールバックが静的な時間なしで実行を終了するのを待っています

  20. 20

    システムコールでJavaスレッドが待機/ブロックされている場合でも、Javaスレッドは実行可能であるように見えますか?

  21. 21

    ループが実行されるのを待って、ノード J で値を取得しています

  22. 22

    PHP ampq + rabbit MQ-長時間実行されるプロデューサー:すでに宣言されているキューにメッセージを送信できますが、新しいキューを宣言することはできません

  23. 23

    非同期/ forループの待機NodeJSループの実行をブロックしていません

  24. 24

    LinuxでI / Oを待機しているプロセスがブロックされている時間を確認する

  25. 25

    長時間実行されているプロセスのバックグラウンド中にEXC_BAD_ACCESSを防止します

  26. 26

    SwingWorkerスレッドで長時間実行されているタスクでGUIがフリーズする

  27. 27

    なぜJavaはガベージコレクターを実行するのにそれほど長い時間待機するのですか?

  28. 28

    スローされたfile.copy例外を実行すると、ファイルにアクセスできませんが使用されています。コードは、コンパイルされていないときにデバッグ時に機能します。

  29. 29

    Github:プルリクエストがマージされるのを待っている間、新しくコミットした新機能を使用します

ホットタグ

アーカイブ