機能により異なります。
簡潔な答え:
同期関数の場合: 1 つずつ呼び出すだけです。
非同期関数の場合: 何が非同期になるかによって異なります。
jQueryアニメーション? アニメーションのメソッドまたは fx キューの Promise オブジェクトからコールバック パラメータを定義します。
setTimeout/setInterval/何か他のもの? ほとんどの場合、コールバックまたは Deferred/Promise オブジェクトを提供するために関数を書き直す必要があります。
例については、thisまたはthisを参照してください。
長い答え:
コメントの jsFiddles によると、次の 2 つの関数があります。
function firstFunction(){
$(".one").fadeIn(1000).delay(2000).fadeOut();
}
function secondFunction(){
$(".two").fadeIn(1000).delay(2000).fadeOut();
}
secondFunction
の後に実行したいfirstFunction
が、これらの関数を改ざんしたくない場合。その場合、考えられる解決策は 1 つだけです。アニメーション化されている要素からPromise オブジェクトを取得し、成功ハンドラーとして定義します。firstFunction
secondFunction
firstFunction();
$('.one').promise().then(secondFunction);
jsフィドル
promise()
その要素の現在のアニメーション状態にバインドされた Promise オブジェクトを返します。は基本的に、「現在のアニメーションが終了$('.one').promise().then(secondFunction)
したら実行することを約束します。secondFunction
.one
既存の関数を改ざんする場合は、 withinsecondFunction
のコールバック パラメータとして呼び出すこともできますが、これはあまり洗練された解決策ではありません。fadeOut
firstFunction
関数を書き直す場合、理想的な解決策は、Deferred と Promises を使用して非同期関数を調整することです。簡単な入門書は次のとおりです。
- jQuery では、Deferredオブジェクトは、関数の成功/失敗状態を定義するために使用できる特別なオブジェクトです。関数内でこれを使用します。
- Promiseオブジェクトは、これらの成功/失敗状態にコールバックを追加するために使用できる特別なオブジェクトです。関数の外でこれを使用します。
これらのツールを使用すると、いつ「完了」したかを指定するように関数を書き直すことができます。また、関数の外部のコードに、いつ完了したか (および実行後に実行するか) を認識できるようにすることができます。
Deferred と Promise を使用するように書き直すと、コードは次のようになります。
function firstFunction(){
var deferred = $.Deferred();
$(".one").fadeIn(1000).delay(2000).fadeOut(function() {
deferred.resolve();
});
return deferred.promise();
}
function secondFunction(){
var deferred = $.Deferred();
$(".two").fadeIn(1000).delay(2000).fadeOut(function() {
deferred.resolve();
});
return deferred.promise();
}
firstFunction().then(secondFunction);
jsフィドル
すべての関数がこのように記述されている場合、それらの実行順序を制御し、 を使用して順次実行することができますthen()
。より完全な例を次に示します。
function one(){
var deferred = $.Deferred();
$(".one").fadeOut(500, function() {
$(this).appendTo('body').fadeIn(500, function() { deferred.resolve(); });
});
return deferred.promise();
}
function two(){
var deferred = $.Deferred();
$(".two").fadeOut(1500, function() {
$(this).appendTo('body').fadeIn(500, function() { deferred.resolve(); });
});
return deferred.promise();
}
function three(){
var deferred = $.Deferred();
$(".three").fadeOut(1000, function() {
$(this).appendTo('body').fadeIn(500, function() { deferred.resolve(); });
});
return deferred.promise();
}
function four(){
var deferred = $.Deferred();
$(".four").fadeOut(750, function() {
$(this).appendTo('body').fadeIn(500, function() { deferred.resolve(); });
});
return deferred.promise();
}
function five(){
var deferred = $.Deferred();
$(".five").fadeOut(600, function() {
$(this).appendTo('body').fadeIn(500, function() { deferred.resolve(); });
});
return deferred.promise();
}
one()
.then(two)
.then(three)
.then(four)
.then(five);
jsフィドル