jQuery或JavaScript的双重延迟

时间:2011-07-02 11:30:48

标签: javascript jquery function

有没有办法延迟调用JavaScript函数,直到满足两个条件?

我有一个同时启动的slideUp()动画和.get()功能,但任何一个都可以先完成。我希望在两者都完成时调用一个函数。

3 个答案:

答案 0 :(得分:3)

您必须跟踪所有相关信息的计数器或(我的首选方法)标记。

var slideDone, getDone;

$("#foo").slideUp(function() {
    slideDone = true;
    nextThing();
});
$.get({
    // ...
    success: function() {
        getDone = true;
        nextThing();
    }
});

function nextThing() {
    if (slideDone && getDone) {
        // Do the next thing
    }
}

现在,显然我的上述两个条件非常人为,但我发现大部分时间都出现在我的实际工作中,我有实际的信息我可以用来检查,所以不要诉诸人工条件

或柜台:

var counter = 0;

++counter;
$("#foo").slideUp(function() {
    nextThing();
});
++counter;
$.get({
    // ...
    success: function() {
        nextThing();
    }
});

function nextThing() {
    if (--counter === 0) {
        // Do the next thing
    }
}

对于习惯于多线程编程的人来说,这看起来像是竞争条件(如果slideUp开始 get之前完成了怎么办?),但它不是一个在JavaScript上的浏览器,它是单线程的(禁止使用web workers,它使用的语法无论如何都不适用于上面。)

如果你发现这很多,你当然可以将逻辑(不是它的很多,但是......)隔离到一个对象中并重复使用它。

答案 1 :(得分:0)

您可以创建一个简单的布尔变量,委托方法都可以访问这些变量,并检查前一个方法是否已执行。

这样,如果上一个函数已经完成,你可以签入你的委托函数并执行一些方法。

T.J。 Crowders的回答包括这种方法的一些很好的示例代码。

答案 2 :(得分:0)

您可以使用jQuery的Deferred Object: http://api.jquery.com/category/deferred-object/

它实际上非常适合您的需求。您可以将函数设置为仅在绑定到它的所有延迟对象得到解析时执行。 jQuery的一些本机函数默认返回一个延迟对象,比如$ .ajax,我也相信动画(至少是最新版本的jQuery)

阅读文档,它会比我更好地解释它。