Первая версия 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 */});