2017-03-06 2 views
2

アニメーションチェーンを実行する必要があります。私は、次のコードを使用しようとしたが、常に第二()(最初と同時に実行された)JQuery()。done()が正しく動作しない

例1:

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()); 

例2:

間違い
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())通話secondfoo(bar())barを呼び出し、fooにその結果を渡すと同じように、doneにその戻り値を渡します。あなただけの関数参照を渡すので、()オフのままにしたい:

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

あなたはまた、単にfirst()thenを使用することができ、$.whenのための必要はありませんあなたが結合している場合を除き、並列約束:

first().then(second); 

そして、もしあなたが3分の1を持っていれば、それを最後につなげることができ、secondが約束を返すので、secondが完了するのを待つでしょう:

first().then(second).then(third); 
関連する問題