Javascript 为什么return在getJSON中不起作用,为什么我不能从getJSON写入变量?

Javascript 为什么return在getJSON中不起作用,为什么我不能从getJSON写入变量?,javascript,jquery,Javascript,Jquery,我有一个使用getJSON的函数,但它的工作方式与我预期的不同 function balbla(name, param) { $.getJSON("/blabla.json?name=" + name + "&param=" + param, function(data) { return data.bla; }); } 当我在getJSON方法中使用alert(data.bla)时,它可以工作,但当我尝试return d

我有一个使用
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”)
时,它仍然返回
未定义的

AJAX是异步的。在这种依赖于AJAX调用结果的函数中,很难返回值。更改函数以接受回调:

function balbla(name, param, cb) {
    $.getJSON('/blabla.json', {name:name, param: param}, function(data) {
        cb(data.bla);
    });
}
balbla('foo', 'bar').done(function(data) {
    alert(data.bla);
});
然后像这样使用它:

balbla('foo', 'bar', function(bla) {
    // do stuff
});
更干净的方法是返回jqXHR对象:

function balbla(name, param) {
    return $.getJSON('/blabla.json', {name:name, param: param});
}
调用它时,使用jqXHR对象的延迟/承诺接口附加一个成功回调:

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

注意,在同步模式下使用<代码> $.Ajax()/代码>不是你应该考虑的选项。它可能会挂起浏览器的UI(或至少是活动选项卡),直到请求完成。除此之外,异步回调是每个人都采用的方式


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

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

使用返回语句调用函数:

function(data) {
    return data.bla;
}
…没有被您的代码调用(它在jQuery的深处被调用),因此您无法将赋值放在函数调用的左侧

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


如果要对响应数据执行某些操作,在匿名回调函数中执行

即使同步,其代码也可能重复,因为
return
语句不在blablabla函数中。只需返回
$.getJSON
并让调用代码使用承诺附加回调,就可以大大简化此操作。您也可以通过这种方式免费获得错误回调。谢谢您的回答。我试过使用secound清洁剂,但对我来说仍然不起作用!您使用的是旧的jQuery版本吗?你有错误吗?你的真实代码是什么样子的?您发布的内容闻起来像是一个您从未尝试运行过的示例(例如,函数名看起来输入错误)。我使用回调尝试了它,现在可以运行了。我正在使用最新的jquery函数。这个函数就像我试图运行它一样。