質問: 前回の投稿の続きです。 [https://teratail.com/questions/33140](Ajaxを使うとsetTimeout処理がうまくいかない 現在HTML,Javascript(jQuery)を使ってアプリを作っています。 前回の投稿に画面デザインとコードがあるのですが、 **setTimeout内で書いたAjaxコードは,clearTimeoutをしても リクエストが飛ぶ、もしくは、飛ぶことがある。**ということがわかりました。 そこで **setTimeoutの処理の動きを理解したい** と思い、質問しました。 単刀直入に考えをぶつけると、 **setTimeout内の処理は、n秒後に処理が流れて実行されるわけでなく、 n秒経つ前にすでに処理は流れていて、それがn秒後に実行されるのでしょうか?** 前回コードの動きのイメージは以下でした。 1.文字入力後、setTimeoutで0.5秒後に実行される処理を予約する 2.ボタン押下し、clearTimeoutで予約していた処理をキャンセルする 3.そのためsetTimeout内に書かれているAjaxの処理は走らない ただ今回の動きを見て、またアドバイスから、動きのイメージはこうでしょうか? 1.文字入力後、setTimeoutで0.5秒後に実行される処理を予約する。すでに処理は流れているが、実行されない。 2.ボタン押下し、clearTimeoutで予約していた処理をキャンセルする 3.リクエストを投げていたAjaxの処理が実行されることがある やはり知りたいのは **setTimeout内の処理は、n秒後に処理が流れて実行されるわけでなく、 n秒経つ前にすでに処理は流れていて、それがn秒後に実行されるのでしょうか?** ということになると思います。 例えば前回コードのAjax処理の上に `console.log('テスト');` があった場合、この処理も setTimeoutのn秒後に実行される前に流れているのでしょうか? それともAjaxに限ったことなのでしょうか? 長くなってしまいましたが、setTimeoutとAjaxの動きについてわかる方がいらっしゃいましたら、お答えいただけると有難いです。
回答: Ajaxの場合、「結果が帰ってきてから行われる処理」は、ちょうど`setTimeout()`の例のように、別個に実行されます。ということで、時間が経つギリギリぐらいにボタンを押した場合、 1. Ajaxのリクエストが送信されて、「リクエストを受け取った場合の処理」が設定される 2. `clearTimeout()`で、「リクエストを送る処理」が削除される 3. リクエストが帰ってくると、2で削除されたのとは**全く別個に**、「リクエストを受け取った場合の処理」が動く という流れになっています。「`setTimeout()`してもその場で実行される」なんてことはありません。