アニメーションなどの直列処理をするときjQueryのDeferredとpipeを使うと便利。
$.Deferred().pipe(function () {
// なんらかの処理
// ajaxとかanimateとかdeferredとかのpromiseしたjQueryオブジェクトを返す。
// (※それらの処理がresolveされた時点で次のpipeに登録した関数が実行される)
return promised;
}).pipe(function () {
// なんらかの処理
// ajaxとかanimateとかdeferredとかのpromiseしたjQueryオブジェクトを返す。
// (※それらの処理がresolveされた時点で次のpipeに登録した関数が実行される)
return promised;
}).pipe(function () {
// なんらかの処理
// ajaxとかanimateとかdeferredとかのpromiseしたjQueryオブジェクトを返す。
// (※それらの処理がresolveされた時点で次のpipeに登録した関数が実行される)
return promised;
}).resolve();
結構冗長なので、次のような関数にしてしまう。
var sequence = function () {
var dfd,
piped,
i,
l = arguments.length;
dfd = $.Deferred();
for (i = 0; i < l; i += 1) {
if ($.isFunction(arguments[i])) {
piped = (piped ? piped : dfd).pipe($.proxy(function () {
return this();
}, arguments[i]));
}
}
dfd.resolve();
};
sequence(
function (){
// なんらかの処理
// ajaxとかanimateとかdeferredとかのpromiseしたjQueryオブジェクトを返す。
// (※それらの処理がresolveされた時点で次のpipeに登録した関数が実行される)
return promised;
},
function (){
// なんらかの処理
// ajaxとかanimateとかdeferredとかのpromiseしたjQueryオブジェクトを返す。
// (※それらの処理がresolveされた時点で次のpipeに登録した関数が実行される)
return promised;
},
function (){
// なんらかの処理
// ajaxとかanimateとかdeferredとかのpromiseしたjQueryオブジェクトを返す。
// (※それらの処理がresolveされた時点で次のpipeに登録した関数が実行される)
return promised;
}
);
CoffeeScriptで書くときはもっとすっきり書ける。
sequence(
->
# なんらかの処理
# ajaxとかanimateとかdeferredとかのpromiseしたjQueryオブジェクトを返す。
# (※それらの処理がresolveされた時点で次のpipeに登録した関数が実行される)
promised
->
# なんらかの処理
# ajaxとかanimateとかdeferredとかのpromiseしたjQueryオブジェクトを返す。
# (※それらの処理がresolveされた時点で次のpipeに登録した関数が実行される)
promised
->
# なんらかの処理
# ajaxとかanimateとかdeferredとかのpromiseしたjQueryオブジェクトを返す。
# (※それらの処理がresolveされた時点で次のpipeに登録した関数が実行される)
promised
)