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

在Javascript中,延迟函数是否按顺序执行?,javascript,ios,prototypejs,Javascript,Ios,Prototypejs,我的代码可能会在短时间内连续延迟两个或多个函数。我能保证每个延迟函数都会按照我创建它们的顺序执行吗?对于iOS 5和iOS 6上的web应用程序,代码的正确性取决于按顺序执行的延迟函数 我正在使用,它使用0.01秒的超时来实现 “延迟”功能不会立即运行;相反,它将以同样的方式运行 一旦解释器的调用堆栈为空 从我自己的测试来看,它们似乎是按照我创建它们的顺序执行的。下面的代码按顺序打印了0到99之间的所有整数 测试代码 for (var i = 0; i < 100; i++) {

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

我正在使用,它使用0.01秒的超时来实现

“延迟”功能不会立即运行;相反,它将以同样的方式运行 一旦解释器的调用堆栈为空

从我自己的测试来看,它们似乎是按照我创建它们的顺序执行的。下面的代码按顺序打印了0到99之间的所有整数

测试代码

for (var i = 0; i < 100; i++) {
    (function(x) {
        return function() {
            console.info(x);
        }
    })(i).defer();
}
然而,这一结果并不是决定性的。我不知道它在更深层次的函数或不同的CPU负载下是如何工作的。

Prototype.js使用
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);
}
for 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 );
var funcsToRun=[];
var currFunc=0;
//添加函数
对于(变量i=0;i<100;i++)
{ 
funcsToRun.push(函数(x){
返回函数(){
控制台信息(x);
}
);
}
//这将连锁执行;
功能链()
{
//运行电流功能
funcsToRun[currFunc](currFunc++);
//如果需要,现在做下一个
if(currFunc
为什么不像没有保证一样编程呢?在
delay()
方法中,它调用
delay()
方法,该方法使用本机
setTimeout()
。为什么不使用自定义事件侦听器呢?即
document.observe('trigger:myfirstevent',function(){});
然后
document.fire('trigger:myfirstevent'));
只要您推迟第一次调用,其余调用将按顺序启动。(自定义事件需要使用“:”进行名称空间设置)@akonsu我发现iOS的JS事件处理在不同于主线程的线程中运行。在多线程环境中,任何函数都可能中途被切断,其他一些代码也会被执行。对于那些习惯于JS传统单线程引擎的人来说,交错代码会导致状态机问题。为了缓解这些问题,我建议问题是,我想推迟一些事件处理回调以模拟单线程代码排序。我认为这里的问题有您的答案:
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 );