单击myFunction并等待它完成

时间:2014-08-07 15:59:51

标签: javascript jquery

我认为这很容易做到,但我找不到任何帮助我的东西。

我有一个功能

(function($){
    myFunction = function(e){
        e.preventDefault();
        // do stuff
        // load ajax content
        // animate and show
    }
    $('.button').on( 'click', myFunction);
})(jQuery);

现在这有效,但我需要知道,如果有人在很短的时间内按下很多.button s导致一切都被button

我已经尝试过promise()

$('.button').on( 'click', function(){
    $.when( myFunction() ).done(function() {
        alert('finished')
    });
});

但是这给了我一个错误e is undefined

$('.button').on( 'click', myFunction).promise().done(function() {
    alert('finisehd');
});

任何人都知道我做错了什么以及如何才能让它发挥作用?

3 个答案:

答案 0 :(得分:1)

最常见的解决方案是在调用myFunction时在click处理程序中设置一个变量,并在每次调用click处理程序时检查其状态。 这可以在以下某处完成:

(function($){
    var wait = false;

    myFunction = function(e){
        e.preventDefault();

        if (wait) {
            return;
        }

        wait = true;

        // ...

        wait = false;
    }
    $('.button').on( 'click', myFunction);
})(jQuery);

答案 1 :(得分:0)

您的函数myFunction需要一个参数,当您调用myFunction()时,参数丢失 没有经过测试,但它应该有效:

$('.button').on( 'click', function(e){
    $.when( myFunction(e) ).done(function() {
        alert('finished')
    });
});

答案 2 :(得分:0)

除了不传递e变量。您错误地使用了$.when

如果您希望在 done完成其ajax调用后使用名为myFunction函数。您需要从myFunction返回承诺。

function myFunction(e) {
    return $.Deferred(function(deferred) {
        doAjax(function(content) { // callback
            deferred.resolve(content);
        });
    });
}

现在你做的时候

// inside event handler
$.when(myFunction(e)).done(function(content) {
    // whoo!
});