Javascript I';我不正确地使用了.done(),不';t按预期返回值
我试图使用jQuery的AJAX延迟来返回一个可以解析和使用的JSON字符串,但我把自己编码到了一个角落,可能把逻辑搞砸了。我希望AJAX调用的结果会在Javascript I';我不正确地使用了.done(),不';t按预期返回值,javascript,jquery,promise,deferred,Javascript,Jquery,Promise,Deferred,我试图使用jQuery的AJAX延迟来返回一个可以解析和使用的JSON字符串,但我把自己编码到了一个角落,可能把逻辑搞砸了。我希望AJAX调用的结果会在.done()回调中返回,它们是。我认为一旦完成,我就可以返回结果,以便在函数的其余部分中使用。我知道我错过了一些非常明显和简单的东西,我只是无法确定它是什么 这是函数的初始编码,仍然处于测试模式。JSON在.done()函数中正确返回,但我无法将其分配到函数之外以供使用 checkUserRoles = function(){ var
.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;
};
checkUserRoles=function(){
var userRole,foo,roles,i$,len$,i;
userRole=roleChecker();
foo=userRole.done(函数(数据){
var-bar;
bar=foo.responseText;//正确返回JSON数据
控制台日志(bar);
返回栏;//未定义,这就是问题所在
});
if(userRole!==false){
userRole=jsonDecode(userRole);
}否则{
userRole=“”;
}
roles=userRole.split(',');
$(“如果用户角色”).hide();
对于(i$=0,len$=roles.length;i$=0){
hashedCookie=cookie;
hash=hashedCookie.split('=');
userHash=theHash[1];
}
}
post=$.ajax({
url:“/services/check_hash.php”,
数据:{
hash:userHash
},
类型:“职位”
});
回程站;
};
您在这里看到的代码是我们广泛使用的LiveScript编译的输出。我不认为LiveScript会对最终结果产生影响,我只是需要做很多工作才能得到我所期望的正确的JavaScript/jQuery输出
注意:由于这或多或少是代码foo
的第一次传递,因此不会传递到后续的if语句,因为userRole
最初是在尝试使函数更具动态性之前为初始测试硬编码的
如何返回
foo.responseText
或bar
,以便在后续过程中使用?我是否需要在.done()
函数中以if
条件开始放入过程?您要查找的是。然后是而不是.done
.done
所做的是执行一个操作并返回相同的承诺。另一方面,则
返回一个新的承诺,该承诺由提供给它的回调返回值解析。(假设$.ajax
正确解析)
当然,您需要将随后执行的所有操作都放在链中:
userRole.then(function(data){
var bar;
bar = foo.responseText; // correctly returns the JSON data
console.log(bar);
return bar;
}).then(function(role){;
if (role != false) {
role = jsonDecode(userRole);
} else {
userRole = "";
}
//...
return true;
});
您还应该返回
,承诺稍后再钩住它。看起来您正在同步使用延迟对象,而这(正如您在标题中提到的)并不是预期的目的。在注册处理程序后,处理用户数据的代码将立即执行,因此您的数据尚未准备就绪
在延迟承诺上注册.then()
时,您告诉程序在延迟对象解析或拒绝后运行一段代码。程序将不会等待直到延迟对象被解析或拒绝,它将继续处理代码(这是延迟对象系统的优点!)
例如:
var checkUserRoles = function () {
var userRole = roleChecker();
// go off and find the user data
// but *don't wait for it before continuing code execution*
userRole.then(function(data){
// at this point the AJAX request has finished, and we have the data
console.log(data);
// put code to process the user data here
});
// code here is executed immediately after registering the .then handler
// so the user data has not loaded yet
};
var roleChecker = function () {
var defer = $.Deferred();
var post = defer.promise();
// simulate an AJAX Request, returns after 2 seconds
setTimeout(function () {
defer.resolve('user data here!');
}, 2000);
return post;
};
checkUserRoles();
向上投票,承认您错误地使用了它,而不是说它没有按应有的方式工作。它不确定我的密切投票被删除的原因,但这是以下内容的重复: