Użyłem odpowiedzi udzielonej przez Carcione i zmodyfikowałem ją, aby używała 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');
}
}
Dodałem typ danych „JSON” i zmieniłem tekst .responseText na responseJSON .
Pobrałem również status za pomocą właściwości statusText zwróconego obiektu. Zauważ, że jest to stan odpowiedzi Ajax, a nie to, czy JSON jest poprawny.
Back-end musi zwrócić odpowiedź w poprawnym (poprawnie uformowanym) JSON, w przeciwnym razie zwracany obiekt nie zostanie zdefiniowany.
Przy udzielaniu odpowiedzi na oryginalne pytanie należy wziąć pod uwagę dwa aspekty. Jeden mówi Ajaxowi, aby działał synchronicznie (ustawiając async: false ), a drugi zwraca odpowiedź za pomocą instrukcji return funkcji wywołującej, a nie w funkcji wywołania zwrotnego.
Próbowałem też z POST i zadziałało.
Zmieniłem GET na POST i dodałem dane: 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;
}
Zauważ, że powyższy kod działa tylko w przypadku, gdy asynchronizacja jest fałszywa . Jeśli miałbyś ustawić async: true, zwrócony obiekt jqxhr nie byłby prawidłowy w momencie powrotu wywołania AJAX, tylko później, gdy zakończy się wywołanie asynchroniczne, ale jest o wiele za późno, aby ustawić zmienną odpowiedzi .
beforecreate
.