Как я могу вернуть текст ответа AJAX? - PullRequest
2 голосов
/ 10 октября 2009

Ради более организованного кода вместо того, чтобы помещать функцию обратного вызова в мой обработчик req.onreadystatechange, я хотел бы просто вернуть данные.

В следующем javascript var «raw_data» не определен, потому что функция parse_data () вызывается перед ответом ajax.

function dostuff(){
   var raw_data = ajax_fetch_data();
   var parsed_data = parse_data(raw_data);
}

Можно ли не вызывать parse_data (), пока req.onreadystatechange в ajax_fetch_data () не вернет данные?

Мне не нравится, когда вызов parse_data () вкладывается как обратный вызов в ajax_fetch_data ().

Ответы [ 2 ]

1 голос
/ 10 октября 2009

Этот код слишком расплывчат: var raw_data = ajax_fetch_data ();

Обычно это так:

// url = ...
// data = ...
create_ajax_request(url, data, callback);
// This will continue to execute like normal
// ...
// ...
// ...

// Now, in a differnt part of the code:
function callback() {
    // Sometime later, when AJAX returns data, this is called.
}

Таким образом, по сути, у вас есть два потока: основная программа, в которой вы «запускаете» запрос, и функция обратного вызова, которая вызывается по завершении запроса. Это все еще игнорирует детали.

Если вы хотите SJAX (неправильное сокращение для синхронного javascript & xml), то вы можете использовать что-то вроде jQuery:

var result = null;
$.ajax({
    aync: false,
    data: data,
    url: url,
    success: function(data) {
        result = data;
    }
});
// result is populated before $.ajax() moves on, so you can use it right after
console.log('result: ' + result);

Однако, это выполняет ожидание занятости (т. Е. Ваш браузер застрял / заблокирован до тех пор, пока данные не поступят ... может быть несколько мс, может быть минута, кто знает). Так что это следует использовать только при необходимости. Если вы просто хотите получить данные и затем обработать их, используйте обратные вызовы.

// Call this to start a request
function startRequest() {
    data = ...
    create_ajax_request(url, data, continueRequest);
}

// This is called once we have the data
function continueRequest(data) {
    alert(data);
}

Это более типично для программ AJAX.

1 голос
/ 10 октября 2009

A в Ajax означает «асинхронный». Если ваш вызов асинхронный, невозможно использовать возвращаемое значение, подобное этому. Вы должны ждать события с обратным вызовом. Тем не менее, вы можете отправить синхронный запрос следующим образом:

var req = new XMLHttpRequest();  
req.open('GET', 'http://www.example.org/', false);
req.send(null);  
if(req.status == 200)  
    return req.responseText;  

, где false во второй строке указывает синхронную природу (значение третьего аргумента по умолчанию равно true).

Больше информации есть в Mozilla Developer Center .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...