4

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

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 函数内部设置邀请 URL?

谢谢

4

3 回答 3

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 调用。该函数将使用邀请 URL。与此同时,您可以为您的客户做其他事情。

如果在您收到响应之前您的软件无事可做,则设置一个忙碌指示符(旋转圆圈或其他东西),然后启动 json 请求并让函数在您收到响应时取消忙碌指示符。

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

于 2012-07-08T02:22:08.830 回答
2

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

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

于 2012-07-08T02:27:05.570 回答
1

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

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

于 2012-07-08T02:20:14.210 回答