JQuery when()。done()无法正常工作

时间:2017-03-06 10:00:54

标签: javascript jquery

我需要运行一些动画链。我尝试使用以下代码,但始终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。我知道,我可以在动画调用中使用“完整”设置,但是我有很多关于大条件列表的动画,使用“完整”设置会使代码无法读取。

1 个答案:

答案 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);