2013-04-16 62 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);