Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript I';我不正确地使用了.done(),不';t按预期返回值_Javascript_Jquery_Promise_Deferred - Fatal编程技术网

Javascript I';我不正确地使用了.done(),不';t按预期返回值

Javascript I';我不正确地使用了.done(),不';t按预期返回值,javascript,jquery,promise,deferred,Javascript,Jquery,Promise,Deferred,我试图使用jQuery的AJAX延迟来返回一个可以解析和使用的JSON字符串,但我把自己编码到了一个角落,可能把逻辑搞砸了。我希望AJAX调用的结果会在.done()回调中返回,它们是。我认为一旦完成,我就可以返回结果,以便在函数的其余部分中使用。我知道我错过了一些非常明显和简单的东西,我只是无法确定它是什么 这是函数的初始编码,仍然处于测试模式。JSON在.done()函数中正确返回,但我无法将其分配到函数之外以供使用 checkUserRoles = function(){ var

我试图使用jQuery的AJAX延迟来返回一个可以解析和使用的JSON字符串,但我把自己编码到了一个角落,可能把逻辑搞砸了。我希望AJAX调用的结果会在
.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();

向上投票,承认您错误地使用了它,而不是说它没有按应有的方式工作。它不确定我的密切投票被删除的原因,但这是以下内容的重复: