Возвращаемое значение из функции обратного вызова - PullRequest
4 голосов
/ 04 февраля 2011

У меня есть несколько функций, которые вызывают другие (встроенные функции в браузере), что-то вроде этого:

function getItems () {
    var xhr = new XMLHttpRequest();
    xhr.open("GET", "http://another.server.tld/", true);
    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4) {
            items = $("a[href^=/courses/]", xhr.responseText);
        }
    };
    xhr.send();
}

Поскольку я не хочу писать больше кода внутри и отделять каждую логическую функциональность, мне нужна эта функция, чтобы возвращать переменные элементы.

Я знаю, что могут произойти некоторые аварии (сеть / сервер недоступен, имеет длинный ответ ...), и функция может возвращать что угодно после получения данных с сервера или истечения времени ожидания.

Ответы [ 2 ]

5 голосов
/ 04 февраля 2011

Это похоже на асинхронный запрос.Я не думаю, что вы сможете вернуть данные из этой функции.

Вместо этого вы можете взять функцию обратного вызова в качестве аргумента этой функции и вызвать этот обратный вызов, когда получите ответ.

Пример:

function getItems (callback) {
    var xhr = new XMLHttpRequest();
    xhr.open("GET", "http://another.server.tld/", true);
    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4) {
            callback(xhr.responseText);
        }
    };
    xhr.send();
}
2 голосов
/ 04 февраля 2011

Вы запрашиваете синхронные запросы: функция не должна возвращать, пока ее возвращаемое значение не может быть вычислено, даже если это потребует сотен миллисекунд запроса сервера для данных.

Установив третий аргументxhr.open до true, вы используете асинхронные запросы - сообщаете браузеру, что вы хотите, чтобы ваша функция возвращалась до получения ответа от сервера .Что в значительной степени означает, что он не может вернуть элементы, так как они еще не были получены.

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

Рекомендуется правильно структурировать код JavaScript для учета асинхронной связи и разрешить возврат значений через обратный вызов вместо return.У вас нет , но в конечном итоге это избавит вас от боли.

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