4

我的代码有可能会在短时间内连续推迟两个或多个函数。我可以保证每个延迟函数都会按照我创建它们的顺序执行吗?对于我在 iOS 5 和 6 上的 Web 应用程序,我的代码的正确性依赖于按顺序执行的延迟函数。

我正在使用Prototype 的 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 负载下的表现如何。

4

1 回答 1

0

Prototype.jsdefer()用作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的规范说顺序是有保证的。然而,许多人声称他们的功能是乱序完成的,因此不同的浏览器可能并不都正确地实现了规范。我假设不能保证订单。

相反,您应该链接您的函数。因此,请执行以下操作:

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 );
于 2013-04-19T15:28:05.360 回答