Зачем мне возвращать значение вне запроса при использовании запросов синхронизации? - PullRequest
0 голосов
/ 14 августа 2011

У меня вопрос о запросах синхронизации.

Справочная информация: мне нужно получить идентификатор пользователя непосредственно перед оформлением заказа. Если userID равен нулю или нулю, я заставлю пользователя войти в систему. Я решил использовать синхронный запрос. Я понимаю разницу между асинхронными и синхронизирующими запросами. Однако я не понимаю, почему первый код ниже не работает, а второй работает.

...
UserId = GetUserId();
...

function GetUserId()
{
  var jsonRequest = new Request({url: myurl, async: false, onComplete: function(result) {return result;}}).get();
}

Когда я использую код выше, я получаю UserId = undefined. Однако это работает, когда я использую код ниже

...
UserId = GetUserId();
...

function GetUserId()
{
  var resultreturned;
  var jsonRequest = new Request({url: myurl, async: false, onComplete: function(result) {resultreturned = result;}}).get();
  return resultreturned;
}

Мне кажется, что в первом коде обработка не останавливается, хотя я использовал async: false. Во втором коде это работает.

Кто-нибудь знает почему?

Кроме того, есть ли способ получить доступ к возвращенному идентификатору без использования var resultreturned? Могу ли я получить доступ к возврату, используя что-то вроде

вернуть jsonRequest.value или jsonRequest.result или что-то еще?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 14 августа 2011

Проблема в объеме. В случае первого примера вы возвращаете значение из анонимной функции, которая не назначена какой-либо переменной.

0 голосов
/ 14 августа 2011

Первая версия GetUserId ничего не возвращает.Просто как тот.То, что анонимная функция, переданная обработчиком завершения, что-то возвращает, не имеет значения;его возвращаемое значение передается некоторой внутренней функции mootools и игнорируется.

Что касается доступа к результату, базовый объект XMLHttpRequest должен быть доступен как свойство xhr объекта Request (хотя это не отображаетсябыть частью открытого интерфейса запроса ), а ответ (в свою очередь) доступен как свойство responseText объекта XHR.Короче, попробуйте:

jsonRequest.xhr.responseText

Однако в этом нет необходимости.Любой синхронный запрос может быть превращен в асинхронный запрос путем передачи обратного вызова для выполнения после завершения запроса.Функция, которую вы передаете в качестве аргумента onComplete, является примером этого.Это имеет техническое название « продолжение, проходящее » (« продолжение » - это, в некотором смысле, неформально, «остальная часть вычисления, начиная с точки отсчета»).

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

function GetUserId(succeed, fail)
{
  var resultreturned;
  var jsonRequest = new Request({url: myurl, async: false, onSuccess: function(result) {resultreturned = result;}, onFailure: fail}).get();
  succeed(resultreturned);
}

Чтобы завершить переключение, передайте продолжение на Request вместо вызова его в GetUserId и сделайте запрос асинхронным.

function GetUserId(succeed, fail)
{
  new Request({url: myurl, onSuccess: succeed, onFailure: fail}).get();
}

...
function checkoutOrLogin(userId, responseXML) {
    if (userId) {
        /* continue checkout */
    } else {
        /* display login form */
    }
}
GetUserId(checkoutOrLogin, function(xhr) {/* display error message */});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...