gpt4 book ai didi

Jquery 在用户定义的函数之间等待

转载 作者:行者123 更新时间:2023-12-01 07:18:01 25 4
gpt4 key购买 nike

我有两个函数,tick 和 tock。它们使 4 个数字先朝一个方向旋转,然后朝另一个方向旋转。每个数字可以以不同的速率缓解。

我可以调用这两个函数,但我无法让第二个函数(tock)等待,直到所有数字都完成第一个函数(tick)的移动。

我看过其他类似的问题,其中使用了回调,但我似乎无法用我的示例来实现这一点。我要么在第一个函数完成之前继续执行第二个函数,要么像下面的代码一样,只使用第一个函数。

谢谢

$(document).ready(function(){
var complete = 0;

tick('', function(){tock();});

function tick(a){

$('#col1 img')
.delay('1000')
.animate({bottom:'-=80px'},5000,'easeInOutSine');
complete++;

$('#col2 img')
.delay('1000')
.animate({bottom:'+=720px'},1000,'easeInOutSine');
complete++;


$('#col3 img')
.delay('1000')
.animate({bottom:'+=560px'},500,'easeInOutSine');
complete++;


$('#col4 img')
.delay('1000')
.animate({bottom:'-=240px'},2000,'easeInOutSine');
complete++;

}

function tock(){
$('#col1 img')
.delay('1000')
.animate({bottom:'+=80px'},2000,'easeInOutSine');

$('#col2 img')
.delay('1000')
.animate({bottom:'-=720px'},2000,'easeInOutSine');

$('#col3 img')
.delay('1000')
.animate({bottom:'-=560px'},2000,'easeInOutSine');

$('#col4 img')
.delay('1000')
.animate({bottom:'+=240px'},2000,'easeInOutSine');
}
});

最佳答案

您必须等到所有动画完成后才能调用其他函数。所有 jQuery 对象都实现 promise interface [docs]当任何动画完成时,它们就会得到解决。与$.when [docs]一起,您可以轻松实现您想要的:

function tick(callback){

var p1 = $('#col1 img')
.delay('1000')
.animate({bottom:'-=80px'},5000,'easeInOutSine')
.promise();

var p2 = $('#col2 img')
.delay('1000')
.animate({bottom:'+=720px'},1000,'easeInOutSine')
.promise();


var p3 = $('#col3 img')
.delay('1000')
.animate({bottom:'+=560px'},500,'easeInOutSine')
.promise();


var p4 = $('#col4 img')
.delay('1000')
.animate({bottom:'-=240px'},2000,'easeInOutSine')
.promise();

// $.when returns a new promise which is resolved once each passed promise
// is successfully resolved
$.when(p1, p2, p3, p4).done(callback);
}

function tock(){
// same as the original code
}

tick(tock);

有关 promise /延期的更多信息:http://api.jquery.com/category/deferred-object/ .

<小时/>

由于如此多的代码重复让我感到焦虑,这里是 tick 函数的重构版本:

function tick(callback) {
var data = [
{props: {bottom: '-=80px'}, duration: 5000},
{props: {bottom: '+=720px'}, duration: 1000},
{props: {bottom: '+=560px'}, duration: 500},
{props: {bottom: '-=240px'}, duration: 2000}
];
var promises = [];

// assuming the elements are in the correct document order
$('#col1, #col2, #col3, #col4').find('img').each(function(i) {
var d = data[i];
promises.push(
$(this).delay(1000).animate(d.props, d.duration, 'easeInOutSine').promise()
);
});

$.when.apply($, promises).done(callback);
}

关于Jquery 在用户定义的函数之间等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17091165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com