【问题标题】:Why is return not working in getJSON and why cant I write into variable from getJSON?为什么返回在 getJSON 中不起作用,为什么我不能从 getJSON 写入变量?
【发布时间】:2012-05-30 22:28:15
【问题描述】:

我有一个使用 getJSON 的函数,但它没有像我预期的那样工作。

function balbla(name, param) {
        $.getJSON("/blabla.json?name=" + name + "&param=" + param, function(data) {
                return data.bla;
        });
}

当我在 getJSON 方法中使用 alert(data.bla) 时,它可以工作,但是当我尝试 return data.bla 时,它不起作用。此外,当我创建一个变量并尝试将data.bla 的值写入它时,它根本不起作用!

// 我试过这个:

function getRouteData(name, param) {
    return $.getJSON('/routes_js.json', {route:name, opt: param});
}
function getRoute(name, param) {
        getRouteData(name, param).done(function(data) {
                return data.route;
        });
}

但是当我调用getRoute("bla", "blub") 时,它仍然返回undefined

【问题讨论】:

标签: javascript jquery


【解决方案1】:

AJAX 是异步的。在这种依赖于 AJAX 调用结果的函数中,您不能轻易地返回值。更改您的函数以接受回调:

function balbla(name, param, cb) {
    $.getJSON('/blabla.json', {name:name, param: param}, function(data) {
        cb(data.bla);
    });
}

并像这样使用它:

balbla('foo', 'bar', function(bla) {
    // do stuff
});

更简洁的方法是返回 jqXHR 对象:

function balbla(name, param) {
    return $.getJSON('/blabla.json', {name:name, param: param});
}

调用时,使用jqXHR对象的deferred/promise接口附加成功回调:

balbla('foo', 'bar').done(function(data) {
    alert(data.bla);
});

请注意,在同步模式下使用$.ajax() 根本不是您应该考虑的选项。它可能会挂起浏览器的 UI(或至少是活动选项卡),直到请求完成。除此之外,异步回调是每个人都这样做的方式。

如果您不喜欢使用回调函数,可以使用tamejs 等预处理器自动生成异步函数。

【讨论】:

  • 您可以通过返回$.getJSON 并让调用代码使用promise 附加回调来大大简化此操作。您还可以通过这种方式免费获得错误回调。
  • 感谢您的回答。我尝试了第二种更清洁的方法,但它仍然对我不起作用!
  • 您使用的是旧的 jQuery 版本吗?你有错误吗?你的真实代码是什么样子的?您发布的内容闻起来像您从未尝试运行的示例(例如,函数名称看起来错字)
  • 我尝试使用回调,现在它可以工作了。我正在使用最新的 jquery 函数。该功能就像我尝试运行它一样。
【解决方案2】:

返回语句的函数:

function(data) {
    return data.bla;
}

... 没有被您的代码调用(它在 jQuery 内部被调用),因此您无法在函数调用的左侧进行赋值。

它也作为异步函数的一部分被调用,因此balbla 函数将在匿名函数被调用之前完成运行并返回。

如果您想对响应数据做一些事情,请在匿名回调函数中

【讨论】:

    【解决方案3】:

    getJSON 是异步的,不是同步的。您需要使用回调,因此您的逻辑需要分两步完成。调用步骤和处理步骤。

    【讨论】:

    • 即使它是同步的,他的代码也不会工作,因为 return 语句不在 blabla 函数中
    猜你喜欢
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多