0

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

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

当我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;
        });
}

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

4

3 回答 3

5

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之类的预处理器来自动生成异步函数。

于 2012-05-30T13:53:20.683 回答
3

带有您的 return 语句的函数:

function(data) {
    return data.bla;
}

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

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

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

于 2012-05-30T13:55:45.037 回答
2

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

于 2012-05-30T13:53:44.437 回答