我想更多地了解法在Javascript链接,并想知道正确的方式来创建一个没有jQuery的延迟在链中的下一个函数:
var foo = function() {
this.delay = function(per) {
setTimeout(start, per);
return this;
};
this.start = function() {
alert('start!');
};
};
var bar = new foo().delay(1000).start();
这是不容易做到的。 jQuery使用一个特定的队列系统 。
假设你想这样做没有jQuery的,你就必须自己实现一个队列。
例如,这非常简单的实现:
var foo = function() {
var queue = [];
var timer;
this.delay = function(per) {
timer = setTimeout(function(){
timer = 0;
var f;
while (f = queue.shift()) f();
}, per);
return this;
};
this.addFunction = function(f) {
if (timer) queue.push(f);
else f();
return this;
};
this.start = function() {
this.addFunction(function(){alert('start')});
return this;
};
};
示范
如果你想链foo中而不是定义的另一个功能,你可以这样做
var bar = new foo().delay(3000).start()
.addFunction(function(){alert("another chained one")});
示范
这将允许您与多个延迟链: http://jsfiddle.net/z4Uyf/1/
JS:
var foo = function() {
var delayed = [];
var delayExecution = false;
var delayCount = 0;
function handleDelay(func){
delayed.push(func);
delayCount++;
}
function delayDone(){
delayExecution = false;
if( typeof(delayed[0]) == "function" ){
delayed[0]();
delayed.splice(0,1);
}
if( delayed.length > 0 ) delayExecution = true;
}
this.delay = function(per) {
delayExecution = true;
setTimeout(function(){
delayDone();
}, per);
return this;
};
this.start = function() {
if( delayExecution ){
handleDelay(arguments.callee);
}else{
alert("start!");
}
return this;
};
};
var bar = new foo().delay(1000).start().delay(5000).start();