Carcione からの回答を使用し、JSON を使用するように変更しました。
function getUrlJsonSync(url){
var jqxhr = $.ajax({
type: "GET",
url: url,
dataType: 'json',
cache: false,
async: false
});
// 'async' has to be 'false' for this to work
var response = {valid: jqxhr.statusText, data: jqxhr.responseJSON};
return response;
}
function testGetUrlJsonSync()
{
var reply = getUrlJsonSync("myurl");
if (reply.valid == 'OK')
{
console.dir(reply.data);
}
else
{
alert('not valid');
}
}
「JSON」のdataTypeを追加し、 .responseTextをresponseJSONに変更しました。
また、返されたオブジェクトのstatusTextプロパティを使用してステータスを取得しました。これは Ajax レスポンスのステータスであり、JSON が有効かどうかではないことに注意してください。
バックエンドは、正しい (整形式の) JSON で応答を返す必要があります。そうしないと、返されるオブジェクトが未定義になります。
元の質問に答える際に考慮すべき 2 つの側面があります。1 つは Ajax に ( async: falseを設定して) 同期的に実行するように指示する方法で、もう 1 つはコールバック関数ではなく、呼び出し元の関数の return ステートメントを介して応答を返す方法です。
POSTでも試してみましたが、うまくいきました。
GET を POST に変更し、データを追加しました: postdata
function postUrlJsonSync(url, postdata){
var jqxhr = $.ajax({
type: "POST",
url: url,
data: postdata,
dataType: 'json',
cache: false,
async: false
});
// 'async' has to be 'false' for this to work
var response = {valid: jqxhr.statusText, data: jqxhr.responseJSON};
return response;
}
上記のコードは、asyncがfalseの場合にのみ機能することに注意してください。async: trueを設定した場合、返されたオブジェクトjqxhrは、AJAX 呼び出しが返された時点では有効ではなく、後で非同期呼び出しが終了したときに有効になりますが、応答変数を設定するには遅すぎます。