javascript - 为什么 return 在 getJSON 中不起作用以及为什么我不能从 getJSON 写入变量?

标签 javascript jquery

我有一个使用 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

最佳答案

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 接口(interface)附加成功回调:

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

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

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

关于javascript - 为什么 return 在 getJSON 中不起作用以及为什么我不能从 getJSON 写入变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10817708/

相关文章:

javascript - 为什么 XMLHttpRequest 对象的属性只能通过 console.log() 打印?

javascript - jQuery .on ('click) not working on elements loaded throught .load(' lorem.php')

javascript - 使用 jquery 删除父 div 内绑定(bind)的所有事件

Javascript、Jquery - 添加 url 图像

javascript - 可折叠菜单需要最终调整(jquery)

javascript - 在jsp中使用jquery替换div内容

javascript - 在本地主机上保存文件

javascript - 如何保留 Cognito 用户 session

jquery - WordPress:Slider Revolution 5.0 面临 Javascript 错误

javascript - 如何根据具有多项选择的下拉菜单切换输入字段