2012-02-13 85 views
1

我有一個非常同步的大腳本。JavaScript:異步函數,恢復到同步

1)運行這樣的功能:

var result = doSomethingSynchronous(myVar); 
if (result === 'something') { 
    doSomethingElse(); 
} 

的doSomethingSynchronous函數有一個for循環,一個if語句返回值:

var i = 0; len = someVariable.length; 
for (; i < len; i++) { 
    if (someVariable[i] === 'aString') { 
    return true; 
    } else { 
    doSomethingElse(); 
    } 
} 

因爲for循環和處理可以激烈,我已經用一個迭代隊列處理函數替換了for循環,該函數在從數組中移出一個元素後使用setTimeout異步運行。一旦它異步運行,它當然不會返回該值並將其分配給第一個片段中的'result'變量,並且if語句總是失敗。我的問題是,有沒有辦法讓這部分保持同步?在腳本進入下一行之前是否將值分配給結果?或者我是否必須使用觀察者/中介模式或類似的方式來通知異步功能已完成?

或者我可以使用回調,但實際的實際代碼比這個更長,都取決於同步性。因此,將var result = doSomethingSynchronous()切換爲異步會對其餘的同步腳本產生多米諾骨牌效應,對嗎? :-) 這聽起來像一個困難和容易出錯的轉換,所以我想我會徵求建議。

謝謝!

- UDPATED修復變量名「le」。它應該是「len」

回答

0

爲了將結果賦值給一個值,你需要通過回調和調用,而不是返回一個值,不管你是否推遲了定時器的功能。

function doSomething(someVariable, callback){ 
    var i = 0; len = someVariable.length; 
    for (; i < len; i++) { 
    if (someVariable[i] === 'aString') { 
     callback && callback(true); 
     break; 
    } else { 
     setTimeout(function(){ deferredSomething(callback); }, 10); 
    } 
    } 
} 

function deferredSomething(callback){ 
    /* code.. */ 
    callback && callback('something'); 
} 

doSomething(myVar, function(result){ 
    if (result === 'something') { 
    doSomethingElse(); 
    } 
}); 

我還要提到的是,如果你正在做的事情緊張,你一定要看看網絡工作者,所以你可以卸載到後臺線程,特別是如果你只是一個FireFox的工作插件。https://developer.mozilla.org/En/Using_web_workers

--UPDATED要修復的示例代碼(固定變量 「了」,應爲 「LEN」)