-2

ユーザーが禁止されていて、ポップアップが表示されるかどうかを決定する変数を返したい場合、私の関数はフェッチします。しかし、私が知ったように、getJSON関数から変数を返すことはできません。

 function fetchban() {
    $.getJSON('/fetchban.php',function(data) {

        if(data==0) {

            var banned =  data;
        } else {
            $.each(data,function(index,result) {
            $('#ban-prompt').html(result);
            $('.popup-background').show();
            $('#ban-container-2').show();
            });
        }

    });

    return banned;
}

$('.button').click(function() {
var banned = fetchban();

if(banned==0) {

//display-popup

}

});

関数を呼び出す行がたくさんあるfetchbanので、関数getJSON内の方がいいと思います。解決策は何ですか?

4

1 に答える 1

3

関数には2つの問題があります。

最初の、そして最も重要なことは、それgetJSONが同期的であると仮定しているということです。デフォルトでは非同期です。つまり、取得したデータに基づいて値をfetchban返すことはできません。代わりにfetchban、結果とともに呼び出すコールバックを受け入れる必要があります。

2番目(最初を修正するととにかく消えます)は、宣言されていない変数を返そうとしていることです(成功ハンドラーfetchbanで宣言しているため) 。getJSON

したがって、次fetchbanのように変更します。

function fetchban(callback) {
    $.getJSON('/fetchban.php',function(data) {
        var banned;

        // ...figure out what `banned` should be from the `data`,
        // I'm afraid I couldn't make sense of the code, looked
        // like it always set `banned` to 0.

        // Call the callback with the result
        callback(banned);
    });
}

そして、代わりに

$('.button').click(function() {
    var banned = fetchban();

    if(banned==0) {
        //display-popup
    }
});

これを行う:

$('.button').click(function() {
    fetchban(function(banned) {
        if(banned==0) {
            //display-popup
        }
    });
});

...またははるかに良いのは、到着時にその情報をすでに持っているように、早く取得することです。clickユーザーはクリック時の遅延を嫌い、Webラウンドトリップの最良のケースでさえ人間に気づかれます。

于 2012-07-20T12:10:09.477 に答える