Javascript调用一个函数,在它返回之前不要再调用它

时间:2011-10-04 09:20:35

标签: javascript closures

我有一个按钮,当单击时调用一个函数 - 此函数执行一些异步Ajax并在Ajax返回时警告消息框。我不希望用户多次点击该按钮 - 如果他在Ajax没有返回时点击按钮,则应该提醒错误消息。

我知道这可以使用全局布尔变量轻松完成(将其初始设置为true,进行ajax调用并将其设置为false - 当ajax返回时再次将其设置为true - 检查全局是否为false时用户单击按钮)。也可以类似地完成,如果不使用窗口/全局对象,我使用另一个包含该函数和布尔值的全局对象

但是,我不太喜欢上述方法 - 我认为它们是一个有点老派的Javascript。我想知道是否有一种更优雅的方式来做,例如使用JS闭包!

3 个答案:

答案 0 :(得分:1)

使用此方法,您的变量不会泄漏到全局范围。无法从函数外部操纵此变量:

var foo = (function(){
    var pending = false;
    return function foo(){
        if(pending) return;
        pending = true;

        //...Code

        //When finished:
        pending = false;
    }
})()

其他人可能会建议设置该功能的属性,但这个属性可以很容易地从外部调整,这是不可取的。

答案 1 :(得分:1)

var callback = (function()
{
    var executing = false;
    function yourfunc()
    {
        if(executing) return; // exit if pending
        executing = true;

        // here send the request

        // edit: when the ajax response has returned
        xxxx.onreadystatechange....{
            // do what you need to do with ajax data
            executing = false;
        };
    }
    return yourfunc;
})();

callback();

答案 2 :(得分:1)

匿名函数的格式为

(function(){}))()

last()提供匿名函数的参数。

在上面的示例脚本中(由wes)返回错误,因为回调不是已定义的函数。 Rob使用闭包的方法听起来不错。

干杯...... Sree