2012-07-08 19 views
4

一些奇怪的事情是怎么回事...我有以下功能他:使用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?

谢谢

回答

1

它设置它,但异步。回调函数只在服务器响应到达后才被调用。一旦发送请求,$.getJSON函数就会返回,所以在调用回调函数之前,“second”console.log实际上会首先发生。

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

+0

建议修改? Inser成功的回报? – AnApprentice 2012-07-08 02:21:32

+0

对不起,但你不能返回值。你不能建立一个同步函数,它返回异步请求的值。您可以做的最好的方法是使用成功回调中的值。 – 2012-07-08 02:22:33

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 
}, 

添加要解决你的软件,你需要认识到,你不能做的事情invite_url从服务器接收到的JSON响应之后,直到。 - 如果您的客户端出现网络问题或服务器问题,可能永远不会收到。

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

如果你的软件没有任何东西可以做,直到你得到响应,然后设置一个忙指标(一个旋转的圆圈或者其他东西),然后启动json请求并且当你得到响应时让函数取消忙指标背部。

有关更多信息,请参阅jQuery json文档。

+0

非常有帮助谢谢,有关如何使这项工作的任何建议? – AnApprentice 2012-07-08 02:24:10

2

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

在这种情况下,如果您看到控制台的顺序。它将首先执行invite_url,然后执行data.invite_url。原因是getJSON是异步调用。要使这个工作,你需要调用获取JSON与异步: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