使用getJSON时,如何捕获响应数据?

时间:2012-07-08 02:16:15

标签: javascript jquery json getjson

发生了一些奇怪的事情...我有以下功能:

getInviteLink : function() {
    var me = this,
        invite_url;

    $.getJSON('get_invite_code.json', function(data) {
        console.log(data.invite_url);
        invite_url = data.invite_url;
    });

    console.log(invite_url)

    return invite_url;
},

运行时,第一个控制台日志返回正确的值。但是,在第二个控制台日志上没有任何内容。为什么不能从getJSON函数内部设置invite_url?

由于

3 个答案:

答案 0 :(得分:3)

因为getJSON方法是异步的。发生了什么......

getInviteLink : function() {  // this function is called...
    var me = this,   
    invite_url;               // happens right away

    $.getJSON('get_invite_code.json', function(data) {
        // Step 2, these statements don't happen until later 
        // -- when the response is received
        console.log(data.invite_url);  // this
        invite_url = data.invite_url;
    });  //  Step 1. the getJSON is called right away

    console.log(invite_url) // this happens right after the
                            // the getJSON is called, but before
                            // it gets a response. Thus no data when the log
                            // statement is invoked

    return invite_url;      // also no data (yet) when this return statement
                            // is executed
},

已添加要修复您的软件,您需要意识到在从服务器收到JSON响应之前,您无法对invite_url执行任何操作。 - 如果您的客户遇到网络问题或服务器问题,可能永远不会收到。

您可以将函数传递给getJSON调用。该函数将使用invite_url。在此期间,您可以为您的客户做其他事情。

如果您的软件没有任何内容可以做,直到您收到响应,然后设置一个忙碌指示器(一个旋转的圆圈或其他东西),然后启动json请求并让功能在您收到回复时取消忙碌指示。

有关详细信息,请参阅jQuery json文档。

答案 1 :(得分:2)

你不能将invite_url作为返回值在代码中使用getJSON。如果你想使用inviteURL,需要使用回调函数进行重构。

在这种情况下,如果您看到控制台的顺序。它将首先执行invite_url,然后执行data.invite_url。 getJSON的原因是异步调用。为了使这个工作你需要调用get with带有async:false,你不可能需要使用$ .ajax和datatyoe json。以下示例将匹配您所需的内容。

getInviteLink: function() {
    var me = this,
        invite_url;

    $.ajax({
        url: 'get_invite_code.json',
        dataType: 'json',
        async: false,
        success: function(data) {
            console.log(data.invite_url);
            invite_url = data.invite_url;
        }
    });

    console.log(invite_url)

    return invite_url;
},

如果返回不是强制性的,我建议重构代码并使用回调函数而不是async false。所以你可以使用getJSON

答案 2 :(得分:1)

确实设置了它,但异步。只有在服务器响应到达后才会调用回调函数。但是,$.getJSON函数将在发送请求后立即返回,因此在调用回调函数之前,“第二个”console.log将首先实际发生。

您不能编写这样的函数来同步返回异步服务器请求的结果。