我的代码有可能在短时间内推迟两个或更多功能。我可以保证每个延迟函数将按照我创建它们的顺序执行吗?对于iOS 5上的我的Web应用程序6,我的代码的正确性依赖于按顺序执行的延迟函数。
我正在使用Prototype's defer,这是使用0.01秒的超时实现的。
“延期”功能不会立即运行;相反,它将运行为 解释器的调用堆栈就是空的。
从我自己的测试中看来,它们按照我创建的顺序执行。以下内容依次打印出0到99之间的所有整数。
测试代码
for (var i = 0; i < 100; i++) {
(function(x) {
return function() {
console.info(x);
}
})(i).defer();
}
输出
0
1
2
...
88
99
然而,这个结果并不是决定性的。我不知道它在更深层次的功能或不同的CPU负载下的表现如何。
答案 0 :(得分:0)
Prototype.js的defer()
使用setTimeout()
作为其支持代码。
function delay(timeout) {
var __method = this, args = slice.call(arguments, 1);
timeout = timeout * 1000;
return window.setTimeout(function() {
return __method.apply(__method, args);
}, timeout);
}
//This calls Prototype's delay() function above (which calls setTimeout)
function defer() {
var args = update([0.01], arguments);
return this.delay.apply(this, args);
}
setTimeout的spec表示订单有保证。但是,许多人声称他们的功能已经无序完成,因此不同的浏览器可能并非都正确地实现了规范。我认为订单无法保证。
相反,你应该链接你的功能。所以,做一些像:
var funcsToRun = [];
var currFunc = 0;
//Add the functions
for ( var i = 0; i < 100; i++ )
{
funcsToRun.push( function(x) {
return function() {
console.info(x);
}
);
}
//This will chain the execution;
function chain()
{
//RUn current function
funcsToRun[ currFunc ]( currFunc++ );
//Now do next one if needed
if ( currFunc < funcsToRun.length ) chain();
}
setTimeout( chain, 10 );