カテゴリー
オライリーJavaScript

同期レスポンス

open()メソッドの3番目の引数にfalseを指定すると、同期処理する send()メソッドは、リクエストが完了するまでブロックする。 この場合、イベントハンドラを使う必要はない。 send()が戻ってきたら、XMLHttpRequestオブジェクトの statusプロパティとresponseTextプロパティを確認すればよいだけです。

//指定したURLのコンテンツ用に、同期型の HTTP GETリクエストを発行する
//レスポンスのテキストを返す。
//リクエストが失敗した場合や、
//レスポンスがテキストでなかった場合は、エラーをスローする
function getTextSync(url) {
    var request = new XMLHTTPRequest();	//新しいリクエストを作成する
    request.open("GET", url, false);	//同期型にするために、falseを渡す
    request.send(null);	//ここでリクエストを送信する
    
    //レスポンスが200 OK 以外であればエラーをスローする
    if(request.status !== 200) throw new Error(request.statusText);
    
    //コンテンツタイプが異なる場合はエラーをスローする
    var type = request.getResponsHeader("Content-Type");
    if (type.match(/^text/)) 	//レスポンスがテキストであることを確認
        throw new Error("Expected textual response; got: " + type);
    
    return request.responseText;
}

クライアントサイドJavaScriptはシングルスレッドで動作するため、 send()の帰りを待っている間、ブラウザUIは、完全に停止するので、利用はさけるべき。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です