-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函数,所以我更喜欢getJSONin 函数。解决办法是什么?

4

1 回答 1

3

您的功能有两个问题。

第一个也是最重要的一点是它假设它getJSON是同步的。默认情况下它是异步的,这意味着不可能fetchban根据检索到的数据返回值。相反,fetchban应该接受它用结果调用的回调。

第二个(一旦你修复第一个,它就会消失),是你试图返回一个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用户不喜欢点击时的延迟,即使是网络往返的最佳情况也能引起人们的注意。

于 2012-07-20T12:10:09.477 回答