Я пытаюсь использовать отложенные jQuery AJAX для возврата строки JSON, которая может быть проанализирована и использована, но я закодировал себя в углу и, возможно, прикрутил логику. Я ожидал, что результаты вызова AJAX будут возвращены в обратном вызове .done()
, и они будут. Я однажды подумал, что могу вернуть результат для использования в оставшейся части функции. Я знаю, что мне не хватает чего-то действительно очевидного и простого, я просто не могу сказать, что это такое.Я использую .done() неправильно, не возвращает значение, как ожидалось
Вот начальное кодирование функции, очень сильно в тестовом режиме. JSON правильно возвращается в функции .done()
, но я не могу назначить его вне функции для использования.
checkUserRoles = function(){
var userRole, foo, roles, i$, len$, i;
userRole = roleChecker();
foo = userRole.done(function(data){
var bar;
bar = foo.responseText; // correctly returns the JSON data
console.log(bar);
return bar; // is undefined, this is the problem
});
if (userRole !== false) {
userRole = jsonDecode(userRole);
} else {
userRole = "";
}
roles = userRole.split(',');
$("if-user-role").hide();
for (i$ = 0, len$ = roles.length; i$ < len$; ++i$) {
i = roles[i$];
$("if-user-role[data-role~=" + i + "]").show();
}
return true;
};
this.roleChecker = function(){
var retVal, allCookies, i$, len$, thecookie, hashedCookie, theHash, userHash, post;
retVal = "";
allCookies = document.cookie.split(';');
for (i$ = 0, len$ = allCookies.length; i$ < len$; ++i$) {
thecookie = allCookies[i$];
if (thecookie.indexOf('userHash') >= 0) {
hashedCookie = thecookie;
theHash = hashedCookie.split('=');
userHash = theHash[1];
}
}
post = $.ajax({
url: '/services/check_hash.php',
data: {
hash: userHash
},
type: "POST"
});
return post;
};
код, который вы видите здесь выход из составления LiveScript, которую мы используем широко. Я не думаю, что LiveScript влияет на конечный результат, я просто должен был сделать много, чтобы получить то, что, как я ожидал, будет правильным выходом JavaScript/jQuery.
ПРИМЕЧАНИЕ: потому что это более или менее первый проход в коде foo
не получает переправляется последующее, если заявление, как userRole
первоначально жестко закодированы для первоначального тестирования перед пытаться сделать функцию более динамичный.
Как мне вернуть foo.responseText
или bar
для использования в следующей процедуре? Нужно ли вводить процедуру, начиная с if
условно в функции .done()
?
Upvote для допуска, что вы «неправильно использовать его и не говорить, что он не работает так, как должно быть» – SeinopSys
Не знаю, почему мое закрытое голосование было удалено, но это дубликат: http: // stackoverflow.ком/вопросы/14220321/как к возвратным-ответ-с-с-АЯКС-вызова –