我需要运行一些动画链。我尝试使用以下代码,但始终second()与first()
同时运行示例一:
var first = function(){
var d = new $.Deferred();
$('#ajax-contract-info').fadeOut(1400, function() {
$('#ajax-contract-info').removeClass('in');
$('#ajax-contract-info').css('display', '');
d.resolve();
});
return d.promise();
};
var second = function() {
var d = new $.Deferred();
$('#ajax-other-fields').fadeIn(1400, function() { d.resolve() });
return d.promise();
};
$.when(first())
.done(second());
例二:
var first = function(){
return $('#ajax-contract-info').fadeOut(1400, function() {
$('#ajax-contract-info').removeClass('in');
$('#ajax-contract-info').css('display', '');
}).promise();
};
var second = function() {
return $('#ajax-other-fields').fadeIn(1400, function() { d.resolve() }).promise();
};
$.when(first())
.done(second());
哪里出错?
P.S。我知道,我可以在动画调用中使用“完整”设置,但是我有很多关于大条件列表的动画,使用“完整”设置会使代码无法读取。
答案 0 :(得分:5)
.done(second())
调用 second
并将其返回值传递到done
,就像foo(bar())
调用bar
一样,并传递其结果进入foo
。您只想传递函数引用,所以请不要使用()
:
$.when(first())
.done(second);
// No () ---^
您也可以在then
上使用first()
,除非您要合并并行承诺,否则无需$.when
:
first().then(second);
如果你有第三个,你可以把它链接到最后,它将等待second
完成,因为second
返回一个承诺:
first().then(second).then(third);