getJSON返回变量..解决方案?

时间:2012-07-20 12:07:00

标签: jquery

我的函数在用户被禁止时获取并且我想返回一个确定是否显示弹出窗口的变量;但是,正如我发现你无法从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。解决方案是什么?

1 个答案:

答案 0 :(得分: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到达时拥有该信息。用户在点击时不喜欢延迟,甚至网络往返的最佳情况对人类也是显而易见的。