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

これが実行されると、最初のコンソール ログは正しい値を返します。ただし、2 番目のコンソール ログには何もありません。getJSON関数内からinvite_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 呼び出しに渡すことができます。この関数は、invite_url を利用します。それまでの間、クライアントのために他のことを行うことができます。

応答を受け取るまでソフトウェアが何もすることがない場合は、ビジー インジケーター (回転する円など) を設定し、json 要求を起動して、応答が返ってきたときに関数がビジー インジケーターをキャンセルするようにします。

詳細については、jQuery json ドキュメントを参照してください。

于 2012-07-08T02:22:08.830 に答える
2

about コードで getJSON を使用して、invite_url を戻り値として取得することはできません。InviteURL を使用する場合は、コールバック関数でリファクタリングする必要があります。

この場合、コンソールの順序が表示されます。その場合、最初に invoke_url が実行され、次に data.invite_url が実行されます。getJSON である理由は非同期呼び出しです。これを機能させるには、datatyoe json で $.ajax を使用する必要があるため、async: false で get 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関数はリクエストが送信されるとすぐに返されるため、コールバック関数が呼び出される前に、実際には「2 番目の」console.log が最初に発生します。

非同期サーバー要求の結果を同期的に返すこのような関数を作成することはできません。

于 2012-07-08T02:20:14.210 に答える