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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

4814閲覧

【javascript】status200を拾ってからレスポンス成功時の処理

tajix_japan

総合スコア132

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2017/01/07 05:40

編集2017/01/07 06:00

下記のようなAPIがあります。
このAPIはindex.htmlからもらったデータをsearch1.phpに投げ、JSON方式のコールバックを拾ってくるAPIです。
ただsearch1.phpはレスポンスが鈍く2秒ほど掛かるため、下記のapiのままでは、states200を返す前にデータを送ってしまい毎回nullを返してきます。
このapi.jsについて、「search1.phpがstatus200を返してからレスポンス成功時の処理をさせたい」というのが趣旨です。

if (send_data.readyState == 4 && send_data.status == 200){ }

という処置を嚙ませればいいのはおよそ見当がつくのですが、どう記載すればいいかがわかりません。(適当においた場所では上手くいきませんでした)
お手数ですが、下記のソースを修正いただけますでしょうか?
よろしくお願いいたします。

api.js

javascript

1 2$(function() { 3 // クリックイベントにajax処理を登録する 4 $('body').on('click', 'button[data-btn-type=ajax]', function(e) { 5 console.log('click btn'); 6 // リクエストの下準備 7 // リクエスト時に一緒に送るデータの作成 8 var send_data; 9 send_data = { 10 // テキストボックスの値を設定 11 user_type : $('input').val() 12 }; 13 console.log(send_data); 14 // WebAPIを叩く 15 $.ajax({ 16 // リクエストの内容 17 url: 'search1.php', 18 dataType: "json", 19 data: send_data, 20 // レスポンス成功時の処理 21 success: function(responce) { 22 if (responce.result === "OK") { 23 console.log(responce); 24 $('div[data-result=""]').html(JSON.stringify(responce)); 25 } else { 26 console.log(responce); 27 $('div[data-result=""]').html(JSON.stringify(responce)); 28 } 29 return false; 30 }, 31 // レスポンス失敗時の処理 32 error: function(XMLHttpRequest, textStatus, errorThrown) { 33 console.log(XMLHttpRequest); 34 console.log(textStatus); 35 console.log(errorThrown); 36 $('div[data-result=""]').html(JSON.stringify("データ取得中にエラーが発生しました。")); 37 return false; 38 } 39 }); 40 // フォーカスをテキストボックスに合わせる 41 $('input').focus(); 42 43 return false; 44 }); 45}); 46 47

尚、自分なりに置いてみてうまくいかなかったのは下記です。

// リクエストの内容 url: 'search1.php', dataType: "json", data: send_data,


success: function(responce)

の間にif (send_data.readyState == 4 && send_data.status == 200)を置くしかないと思うのですが。

そうするとカンマ区切りの中に無理やりIF文を入れることになるため動かないだろうと思いながらやったのですがやはり動きませんでした。

javascript

1 2 3$(function() { 4 // クリックイベントにajax処理を登録する 5 $('body').on('click', 'button[data-btn-type=ajax]', function(e) { 6 console.log('click btn'); 7 // リクエストの下準備 8 // リクエスト時に一緒に送るデータの作成 9 var send_data; 10 send_data = { 11 // テキストボックスの値を設定 12 user_type : $('input').val() 13 }; 14 console.log(send_data); 15 // WebAPIを叩く 16 $.ajax({ 17 // リクエストの内容 18 url: 'search1.php', 19 dataType: "json", 20 data: send_data, 21 // レスポンス成功時の処理 22 23//追加してみた 24 25if (send_data.readyState == 4 && send_data.status == 200){ 26 27 success: function(responce) { 28 if (responce.result === "OK") { 29 console.log(responce); 30 $('div[data-result=""]').html(JSON.stringify(responce)); 31 } else { 32 console.log(responce); 33 $('div[data-result=""]').html(JSON.stringify(responce)); 34 } 35 return false; 36 }, 37 // レスポンス失敗時の処理 38 error: function(XMLHttpRequest, textStatus, errorThrown) { 39 console.log(XMLHttpRequest); 40 console.log(textStatus); 41 console.log(errorThrown); 42 $('div[data-result=""]').html(JSON.stringify("データ取得中にエラーが発生しました。")); 43 return false; 44 } 45 }); 46 // フォーカスをテキストボックスに合わせる 47 $('input').focus(); 48 49 return false; 50 }); 51}); 52 53//追加してみた 54} 55 56

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

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

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

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

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

guest1213

2017/01/07 07:16

「レスポンス成功時の処理をさせたい」これを行っているのがあなたが最初のソースで「// レスポンス成功時の処理」と書いている部分です。目的は達成されているはずです。期待した結果が得られないのは他に問題があるのではないでしょうか?
tajix_japan

2017/01/07 13:44

有難うございます。jQueryのajax内ですでにこの判定は行われいますという指摘を受けていますのでソースの改造というよりも何が原因かを突き止めないといけないということですね。有難うございました。
guest1213

2017/01/07 13:56

他の方の回答とコメントを拝見したところChunked Encodingでレスポンスがあるのですね。私は再現や自分の回答を確認できる環境が無いので回答は控えますが、"chunked encoding ajax"などで検索すると実装例や解説なども見つかるかもしれませんね。
tajix_japan

2017/01/07 21:52

有難うございます。turbgraphics200さんから$.ajaxでは、readyStateが4しか処理しないため、普通のやり方だとChunked Encodingを処理することができません。 ということをご教示戴きました。無事他の方法で解決できました。お手数をおかけいたしました。有難うございました。
guest

回答3

0

そのsearch1.phpはHTTP Chunked Encodingでレスポンスを返しているのでしょうか。
Chunked Encodingかどうかの確認は、Chromeで開発ツール(devTools)を開いて、Networkタブを表示させておき、再度、bodyをクリックしてリクエストを投げてみて、search1.phpのResponse Headersに"Transfer-Encoding: chunked"という項目があれば、HTTP Chunked Encodingとなります。

それと、send_data.readyState == 4 && send_data.status == 200を追加とかいう話をしていますが、
jQueryのajax内ですでにこの判定は行われいます(行わないとまず無理)。

投稿2017/01/07 07:53

編集2017/01/07 07:57
turbgraphics200

総合スコア4267

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

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

tajix_japan

2017/01/07 13:40

有難うございます。レスポンスヘッダーは下記の通りです。HTTP Chunked Encodingになっているようです。 >jQueryのajax内ですでにこの判定は行われいます(行わないとまず無理)。 やはりそうでしたか。小さいhtmlファイルは読めるので接続そのものに問題はなさそうです。 レスポンスの遅いサーバーになった途端読めなくなるので困っています。 Connection:Keep-Alive Content-Type:text/html; charset=utf-8 Date:Sat, 07 Jan 2017 13:19:03 GMT Keep-Alive:timeout=15, max=500 Server:Apache/2.2.15 (CentOS) Transfer-Encoding:chunked
guest

0

ベストアンサー

やはり、そうでしたか。
Chunked Encodingは、レスポンスをストリーミングで返します。
つまり、データをある程度のサイズで分割してレスポンスを返します。
Chunked Encodingの場合、途中のデータのレスポンスではreadyStateが3となります。(たしか)
$.ajaxでは、readyStateが4しか処理しないため、普通のやり方だとChunked Encodingを処理することができません。
このブログに書かれているようにxhrFieldsを使って、チャンクデータを取得することができます。
$.ajaxをどうしても使用しなければならないということじゃなければ、普通にxhrを使用して実装したほうがいいかと。
xhrでの実装例

投稿2017/01/07 14:46

turbgraphics200

総合スコア4267

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

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

tajix_japan

2017/01/07 21:39

有難うございます。 >$.ajaxでは、readyStateが4しか処理しないため、普通のやり方だとChunked Encodingを処理することができません。 そうだったんですね。疑問が解けました。何回やっても出来ないわけですね。本当にありがとうございます。 自分なりにググって、下記の方法であれば今回の当方のページを取得出来ました。 これで次に進めそうです。深く感謝いたします。有難うございました。 http://www.ajaxtower.jp/ini/http/index4.html
guest

0

$.ajax()は非同期通信で、レスポンスが返ってくる前に次の処理に行ってしまうので、それを解決したいという質問だと読みました。
asyncをfalseに設定して、同期通信にしてしまうというのはどうでしょうか?

HTML

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="utf-8"> 5 <title>タイトル</title> 6</head> 7<body> 8<form> 9 <label>名前: 10 <input type="text" name="name"> 11 </label> 12 <input type="button" id="button1" value="submit"> 13</form> 14<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 15<script> 16 $("#button1").on("click", function () { 17 var formData = $('form').serialize(); 18 $.ajax({ 19 type: "POST", 20 url: "test.php", 21 async: false, 22 data: formData, 23 success: function (response) { 24 alert(response); 25 } 26 }); 27 }); 28</script> 29</body> 30</html>

PHP

1<?php 2if (!empty($_POST)) { 3 $name = $_POST["name"]; 4 echo "$name"; 5}

追記

alwaysを使う方法を追記します。こちらを使うほうが良いです。

HTML

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="utf-8"> 5 <title>タイトル</title> 6</head> 7<body> 8<form> 9 <label>名前: 10 <input type="text" name="name"> 11 </label> 12 <input type="button" id="button1" value="submit"> 13</form> 14<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 15<script> 16 $("#button1").on("click", function () { 17 var formData = $("form").serialize(); 18 $.ajax({ 19 url: "test.php", 20 type: "POST", 21 data: formData 22 }).always(function (data, statusText, jqXHR) { 23 switch (jqXHR.status) { 24 case 200: 25 alert("通信成功"); 26 alert(data); 27 break; 28 case 404: 29 alert("404"); 30 break; 31 default: 32 alert("不明なエラー"); 33 } 34 }); 35 }); 36</script> 37</body> 38</html>

投稿2017/01/07 06:08

編集2017/01/07 08:01
s8_chu

総合スコア14731

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

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

tajix_japan

2017/01/07 06:29

有難うございます。 当方のソースにasync: false,をdata: send_data,の直後に入れてみました。 単純なHTMLであれば問題なく表示されましたが、今回のサーバー情報は表示することができませんでした。残念です。有難うございました。
guest1213

2017/01/07 07:13

> レスポンスが鈍く2秒ほど掛かる async: falseにするとこの2秒の間はブラウザがフリーズします。同期通信は絶対にしてはいけないと思います。
s8_chu

2017/01/07 07:58

async:falseは非推奨のようですね。失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問