2013-04-16 58 views
4

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

我正在使用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

为什么不编程就好像没有保证?在'defer()'方法中,它调用使用本地'setTimeout()'的'delay()'方法的 – akonsu

+0

。为什么不使用自定义事件侦听器?即'document.observe('trigger:myfirstevent',function(){});'then'document.fire('trigger:myfirstevent');'只要您推迟第一个呼叫,剩下的呼叫将会触发订购。 (自定义事件需要使用“:”命名空间) –

+0

@akonsu我发现iOS的JS事件处理运行在与主线程不同的线程中。在多线程环境中,任何函数都可以在中途切断并执行一些其他代码。交错代码会导致习惯了JS传统单线程引擎的状态机问题。为了缓解这些问题,我想推迟一些事件处理回调来模拟单线程代码排序。 – Pwner

回答

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