2017-03-06 172 views
2

我需要运行一些动画链。我试着用下面的代码,但总是第二()在同一时间第一(运行)JQuery when()。done()无法正常工作

例子之一:

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.我知道,我可以在动画调用中使用“完整”设置,但是我有很多关闭动画的大条件列表,使用“完整”设置会使代码无法读取。

回答

5

.done(second())调用second并将其返回值到done,就像foo(bar())电话bar并将其结果为foo。你只是想通过函数的引用,所以离开关()

$.when(first()) 
.done(second); 
// No() ---^ 

您也可以只是first()使用then,无需$.when除非你结合并行的承诺:

first().then(second); 

如果你还有第三个,你可以链中到结束,它会等待second因为second完成返回一个承诺:

first().then(second).then(third);