【问题标题】:When using getJSON, how to capture the response data?使用getJSON时,如何获取响应数据?
【发布时间】:2012-07-07 23:21:40
【问题描述】:

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

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?

谢谢

【问题讨论】:

    标签: javascript jquery json getjson


    【解决方案1】:

    因为 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 文档。

    【讨论】:

    • 非常有帮助,谢谢,关于如何使它工作的任何建议?
    【解决方案2】:

    您无法在 about 代码中使用 getJSON 作为返回值。如果要使用inviteURL,则需要使用回调函数进行重构。

    在这种情况下,如果您看到控制台的顺序。它会先执行invite_url,然后执行data.invite_url。 getJSON 的原因是异步调用。要使其正常工作,您需要调用 get JSON with async: false with 是不可能的,您需要将 $.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;
    },
    

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 建议修改?在成功内插入返回?
      • 抱歉,您无法返回该值。您不能创建从异步请求返回值的同步函数。你能做的最好的就是使用成功回调中的值。
      猜你喜欢
      • 2013-03-01
      • 2013-10-03
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多