为什么返回不能在getJSON中工作?为什么我不能从getJSON写入变量?

dav*_*idb 0 javascript jquery

我有一个功能,getJSON但它不像我预期的那样工作.

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

当我alert(data.bla)在getJSON方法中使用时,它可以工作,但是当我尝试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;
        });
}
Run Code Online (Sandbox Code Playgroud)

但是当我称之为getRoute("bla", "blub")它仍然返回undefined.

Thi*_*ter 5

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

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

并像这样使用它:

balbla('foo', 'bar', function(bla) {
    // do stuff
});
Run Code Online (Sandbox Code Playgroud)

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

function balbla(name, param) {
    return $.getJSON('/blabla.json', {name:name, param: param});
}
Run Code Online (Sandbox Code Playgroud)

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

balbla('foo', 'bar').done(function(data) {
    alert(data.bla);
});
Run Code Online (Sandbox Code Playgroud)

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

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