在Javascript中,是按顺序执行的延迟函数吗?

时间:2013-04-16 19:53:46

标签: javascript ios prototypejs

我的代码有可能在短时间内推迟两个或更多功能。我可以保证每个延迟函数将按照我创建它们的顺序执行吗?对于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负载下的表现如何。

1 个答案:

答案 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 );