2011-07-02 38 views
1

有没有办法延迟调用JavaScript函数,直到满足两个条件?jQuery或JavaScript中的双重延迟

我有一个slideUp()动画和一个.get()功能,同时开始,但任一个都可以先完成。我想要一个函数在两个都完成时被调用。

回答

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,它使用的语法不适用于上述内容)。

如果你发现这个提升了很多,你当然可以总是把它的逻辑(不是它的lot,但是......)分解成一个对象并重用它。

+0

伟大的代码示例。 +1 –

+0

你应该把整个东西包装在一个'(function(){})()'中,以保持全局范围的清洁 – user123444555621

+0

@ Pumbaa80:暗示某种范围。我并不是说这是顶级脚本,而是他在做他的功能时可能做的。 –

0

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

这样,您可以检查您的委托功能,如果前一个功能已完成并执行某种方法。

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

0

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

这是您所需要的真正的完美。您可以将函数设置为只有在所有绑定到它的延迟对象都解析后才执行。一些jQuery的本地函数默认返回一个延迟对象,比如$ .ajax,我也相信动画(至少jQuery的最新版本)

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