質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

406閲覧

Ajax で 2つ呼び出した処理が 1つ目が終わるまで 2つ目が返ってこない

lavino708

総合スコア1

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2022/11/25 07:01

前提

複数の csv ファイルから DBに取り込む処理を作成していて、取り込みに時間がかかるため、途中経過を表示させるのに ajax を使う事にしました。いろいろ調べながら作っていくうち、壁に当たりました。

実現したいこと

下記の test.js(実際は php から出力)から test1.php を呼び出し、csv ファイルの取込処理中の途中経過進捗をファイルに書き込み(file_put_contents()を利用)ます。
test2.php は 1~2秒ごとに呼び出し、上記進捗ファイルを読み(file_get_contents()を利用)取って、クライアントに返します。(下記 test.js では、1回しか呼び出していません。)
そして、クライアントで途中経過を表示しようとしています。
実際には、以下の様な問題の為、0 % からいきなり 100% になってしまいます。
そもそもそういうものなのでしょうか?

発生している問題

test1.php を呼び出した後、すぐに test2.php が呼び出されるのは期待通りなのですが、test1.php は長く処理がかかり、test2.php は瞬間で終わる処理なのにもかかわらず、test1.php の処理が終わるまで、test2.php の応答がありません。
コンソールには、以下の様に表示されます。

console.log

1step 1 2step 3 3<この間が数十秒かかる> 4step 2 5step 4

期待しているのは、以下の様な順番です。

console.log

1step 1 2step 3 3step 4 4<この間が数十秒かかる> 5step 2

該当のソースコード

test.js

1$(() => { 2 console.log('step 1'); 3 $.ajax({ 4 url:'./test1.php', 5 type:'POST', 6 data:{ 7 'file': 'file1.csv', 8 } 9 }) 10 .done((data) => { 11 //import が終わるまで帰ってこない。 12 console.log('step 2'); 13 }) 14 console.log('step 3'); 15 $.ajax({ 16 url:'./test2.php', 17 type:'GET', 18 }) 19 .done((data) => { 20 //瞬間で返ってくるはず 21 console.log('step 4'); 22 }) 23});

試したこと

test1.php と test2.php の呼び出し順を変更して動かすと、以下の様なログになります。
ただし、test2.php 呼び出しの .done() 内で setTimeout() を使ってもう一度 test2.php を呼び出しても、test1.php の処理が終わるまで帰ってきません。

console.log

1step 1 2step 3 3step 4 4<この間が数十秒かかる> 5step 2

補足情報(FW/ツールのバージョンなど)

https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js を利用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

処理が遅いのは処理開始が遅い場合と、処理データが極端に大きい場合があります。
前者の場合はタイムアウトが発生しない限りひたすら待つしかありません
後者はXHRのprogressを利用すれば送られてきたデータをもとに経過表示が可能です

投稿2022/11/25 07:13

yambejp

総合スコア114779

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lavino708

2022/11/25 07:32

ご回答ありがとうございます。 処理データが多くて、処理時間がかかっています。 文中にある進捗ファイルは途中経過が更新されています。 XHRのprogress で調べてみます。 ありがとうございました。
yambejp

2022/11/25 08:39

ちょっと状況がわかりかねるのですが、経過確認用のファイルがあるのであれば setIntervalでfetchを繰り返し、キャッシュを読まないように適当なパラメータをつけるとかですかね
lavino708

2022/12/02 06:45

ありがとうございます。 setIntervall や setTimeout で設定した処理(例: test2.php)が、test1.php の処理が終わらない限り呼び出されないような状況です。 何か私が思い違いをしているのかもしれません。 改めて落ち着いて考えなおします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問