4

我有这个方法:

function getUserName(guid) {
    var name = "Unbekannt";

    $.getJSON(urlCurrent, {
        "method" : "get_user_info",
        "guid" : guid,
        "auth_token" : temporaryAuthToken
    }, function(data) {
        if (data.status == 0) {
            alert(data.result[0].name);
            name = data.result[0].name;
        }
    });

    return name;
}

几乎一切正常:Ajax-Request 获取数据并触发回调函数,这样

alert(data.result[0].name);

显示具有此值的弹出窗口:“Forename Surname”

但随后在

return name;

该方法返回“Unbekannt”,尽管 name 应该具有新值“Forename Surname”。发生了什么,错误在哪里?

多谢

4

3 回答 3

4

我会从函数中返回 promise 对象并对其采取行动。

function getUserName(guid) {
    return $.getJSON(urlCurrent, {
        "method" : "get_user_info",
        "guid" : guid,
        "auth_token" : temporaryAuthToken
    });
}

getUserName(guid).done(function(data) {
    if (data.status == 0) {
        alert(data.result[0].name);
    }
});

而且,如果您想预先进行状态检查,那么 .then 非常适合。

function getUserName(guid) {
    return $.getJSON(urlCurrent, {
        "method" : "get_user_info",
        "guid" : guid,
        "auth_token" : temporaryAuthToken
    }).then(function(data){
        return $.Deferred(function(def){
            if (data.status == 0) {
                return def.resolve(data);
            }
            return def.reject(data);
        });
    });
}

getUserName(guid).done(function(data) {
    alert(data.result[0].name);
});
于 2012-08-29T14:26:51.700 回答
3

当您返回name时,尚未为其分配从 getJSON 回调中获得的新值,因为 ajax 调用是异步的并且需要一些时间才能完成。

您需要带一个回调函数:

function getUserName(guid, callback) {
    var name = "Unbekannt";

    $.getJSON(urlCurrent, {
        "method" : "coinor.get_user_info",
        "guid" : guid,
        "auth_token" : temporaryAuthToken
    }, function(data) {
        if (data.status == 0) {
            alert(data.result[0].name);
            name = data.result[0].name;
            callback(name);
        }
    });
}

getUserName(guid, function(name) {
    alert(name);
});
于 2012-08-29T14:23:43.797 回答
2

因为return name;在 ajax 调用返回之前执行。

如果您希望它与调用中返回的数据相关$.getJSON(),它也需要在回调函数中。

于 2012-08-29T14:21:33.580 回答