javascript - 我使用 .done() 不正确,没有按预期返回值

标签 javascript jquery promise deferred

我正在尝试使用 jQuery 的 AJAX deferreds 返回一个可以解析和使用的 JSON 字符串,但我已经把自己写进了一个 Angular 落,可能搞砸了逻辑。我希望在 .done() 中返回 AJAX 调用的结果。回调他们是。我认为一旦完成,我就可以返回结果以用于函数的其余部分。我知道我错过了一些非常明显和简单的东西,我只是无法确定它是什么。

这是函数的初始编码,仍然处于测试模式。 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 传递给后续的 if 语句在尝试使函数更具动态性之前,最初是为初始测试而硬编码的。

如何返回 foo.responseTextbar用于后续程序?我需要把程序放在if开头吗?有条件的 .done()功能?

最佳答案

您正在寻找 .then 而不是 .done

.done 所做的是执行一个操作并返回相同的 promise 。另一方面,then 返回一个新的 promise ,该 promise 由提供给它的回调的返回值解决。 (假设 $.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;
});

您还应该返回 promise 稍后 Hook 。

关于javascript - 我使用 .done() 不正确,没有按预期返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27450782/

相关文章:

javascript - React-Redux CSS 转换

javascript - 根据Route显示不同的内容 - Node.js/React

javascript - 在 IE8 中使用 Owl Carousel 和 Respond.js

javascript - React Promise 异步任务顺序不正确

javascript - 如何自定义iframe右键弹窗

javascript - 为 react-konva 阶段设置原点坐标

Jquery DataTable水平滚动

javascript - JavaScript 谷歌饼图 : show an empty pie chart if there is no data to show

javascript - Typescript:类型 'Promise<{}>' 无法分配给类型

javascript - 等待多个并发 await 操作