Почему я не могу установить переменную, равную значению responseText XMLHttpRequest? - PullRequest
0 голосов
/ 07 марта 2009

Если я нахожусь в функции onreadystatechange моего XHR, я легко могу сделать document.title = xhr.responseText, но если я заставлю функцию возвращать responseText, я не могу установить переменную, равную внешней оболочке моего XHR, чтобы сделать ее равной ответу; Есть ли способ сделать это?

Моя оболочка:

ajax = function(url, cb)
 {
    xhr = (window.XMLHttpRequest)
        ? new XMLHttpRequest()
        : new ActiveXObject('Microsoft.XMLHTTP');
    xhr.onreadystatechange = function()
     {
        if (xhr.readyState == 4 && xhr.status == 200)
         {
            cb(xhr.responseText);
         };
     }
    xhr.open('get', url, true);
    xhr.send();
 };

Теперь, если бы я сделал что-то вроде:

ajax('bacon.txt', function(_)
 {
    document.title = _;
 }

работает абсолютно идеально; document.title фактически становится responseText при вызове bacon.txt. Однако, если я попытаюсь реализовать это следующим образом:

document.title = ajax('bacon.txt', function(_)
 {
    return _;
 }

нет такой удачи. Кто-нибудь может уточнить, почему это так? };

Ответы [ 2 ]

7 голосов
/ 07 марта 2009

Вы назначаете возврат функции ajax заголовку. Сама функция ajax ничего не возвращает.

Весь смысл AJAX в том, что функция немедленно возвращает запрос на сервер, до получения любого ответа. Вы присваиваете undefined свойству title (кстати, моя функция ajax обычно возвращает возвращаемый используемый xhr, что позволяет мне при необходимости прервать работу).

Когда запрос завершен, вызывается функция обратного вызова (cb в вашем коде), поэтому ваш исходный код имеет смысл, он выполняет присваивание.

0 голосов
/ 07 марта 2009

результат функции onreadystatechange не совпадает с вашей функцией "ajax" ... Вы можете сделать вашу пост-синхронизацию и заставить функцию ajax возвращать то же самое, но это приведет к задержке ответа пользователя в браузере, если ответ займет слишком много времени.

Лучшее, что вы могли бы сделать, - это найти другой способ сделать это, как вы предпочитаете. Я имею в виду, не пытайтесь заставить это работать таким образом, потому что это будет хуже.

...