Настройка цепочки в mootools довольно проста. однако использование класса Chain в качестве миксина может быть немного более сложным.
как правило, он направлен на создание цепочек классов и методов на основе Fx, а не синхронных. скажем, у вас есть эффект анимации движения, у которого в игре link: chain
, вы можете .chain(function() {})
сделать инстанс после.
Пример callChain в качестве отдельного устройства - это хорошо и достаточно просто, но он мало что дает в плане контроля времени.
тогда есть линейный подход временной шкалы. в вашем случае ваш первый обратный вызов выполняется через 20 мс, 1980 мс, после этого второй, третий запускается через 1680 мс после второго и так далее. если вы объедините все так, чтобы каждый последующий шаг вызывал следующий, вы должны принять это во внимание и фактически передать время ожидания между двумя действиями.
другой способ сделать это - просто отложить их, как вы делали с самого начала.
Я попытался немного упростить первое здесь: http://jsfiddle.net/dimitar/mpzzq/
(function(){
Chain.implement({
slowChain: function(duration){
// console.log(duration);
this.callChain.delay(duration === null ? 500 : duration, this);
}
});
var db = $(document.body);
var fixBody = function(cn, delay) {
console.log(arguments);
db.addClass(cn);
console.log(cn, delay);
if (this.$chain.length) {
this.slowChain(delay || 0);
}
};
var myChain = new Chain(),
funcs = [{
fn: fixBody,
args: ["load"],
delay: 1980
}, {
fn: fixBody,
args: ["load-two"],
delay: 700
}, {
fn: fixBody,
args: ["load-three"],
delay: 2000
}, {
fn: fixBody,
args: ["load-four"],
delay: 0
}];
myChain.chain(
funcs.map(function(el) {
el.args.push(el.delay);
return el.fn.bind.apply(el.fn, [myChain].concat(el.args));
})
);
document.getElement("button").addEvents({
click: function() {
myChain.slowChain(20);
}
});
})();
поэтому в моем массиве объектов funcs я определяю обратный вызов func, передаваемые аргументы и задержку. имейте в виду, что для самого func установлен диапазон this
для экземпляра цепочки, и self вызывает следующий в цепочке, но вы можете легко изменить его и работать с ним.
надеюсь, это даст вам некоторые идеи.
здесь это дубль 2 с функцией декоратора, которая вызывает цепочку с задержкой:
// function decorator.
Function.implement({
chainDelay: function(delay, bind) {
// allows you to set a delay for chained funcs and auto call stack (if bind is a chain instance)
var self = this,
args = (arguments.length > 2) ? Array.slice(arguments, 2) : null;
return function() {
setTimeout(function() {
self.apply(bind, args.concat(Array.from(arguments)));
if (bind && bind.$chain && bind.$chain.length)
bind.callChain.call(bind);
}, delay);
}
},
justChain: function(bind) {
// runs a chained func when due and auto calls stack for next (if bind is a chain instance and avail)
var self = this, args = (arguments.length > 1) ? Array.slice(arguments, 1) : null;
return function() {
self.call(bind, args);
if (bind && bind.$chain && bind.$chain.length)
bind.callChain.call(bind);
}
}
});
var moo = new Chain();
moo.chain(
// some delayed ones.
(function(what) {
console.log(what);
}).chainDelay(3000, moo, "hi"),
(function(what, ever) {
console.log(what, ever);
}).chainDelay(3000, moo, "there", "coda"),
(function(what) {
new Element("div[id=foo][html=" + what +"]").inject(document.body);
}).chainDelay(1000, moo, "mootools FTW!"),
// regular ones here for good measure!
(function() {
document.id("foo").setStyle("color", "red")
}).justChain(moo),
(function() {
document.id("foo").setStyle("background-color", "blue")
})
);
moo.callChain();
пример этого: http://jsfiddle.net/dimitar/Y4KCB/4/