有没有办法延迟调用JavaScript函数,直到满足两个条件?
我有一个同时启动的slideUp()
动画和.get()
功能,但任何一个都可以先完成。我希望在两者都完成时调用一个函数。
答案 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)
阅读文档,它会比我更好地解释它。