2012-02-13 14 views
1

に再開され、非同期機能。JavaScriptを:私は非常に同期している大規模なスクリプトを持って同期

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

doSomethingSynchronous機能があるif文で値を返すforループ:

1)は、このような機能を実行します

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

をのでループし、処理のために激しいことができ、私は配列から一つの要素をシフトした後のsetTimeoutを使用して非同期的に自分自身を実行し、反復キュー処理機能を持つforループを交換しました。それは非同期的に実行したら、もちろんそれは値を返さないと、同期最初のスニペットで「結果」変数に代入して、そこにif文は常に失敗します。私の質問は、この部分を同期させる方法はあるのでしょうか?スクリプトが次の行に進む前に、値を結果に割り当てるか?あるいは、オブザーバー/メディエーター・パターンなどを使用して、非同期関数が完了したことを通知する必要がありますか?

は、代わりに私がコールバックを使用することができますが、実際の実際のコードは、これよりも長く、すべてが同期に依存しています。したがって、var result = doSomethingSynchronous()を非同期に切り替えると、残りの同期スクリプトにドミノの影響が及ぶでしょうか? :-) これは難しく、エラーが発生しやすい変換のように聞こえるので、私は私がアドバイスを求めるだろうと思っていました。

ありがとうございます!

- UDPATEDは "ル" 変数名を修正します。 "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のアドオンで作業している場合は特に、あなたが強烈な何かをやっている場合は、バックグラウンドスレッドにオフロードすることができますので、あなたは間違いなくウェブの労働者を見なければならないことにも言及します。サンプルコード(固定変数 "ル"、 "LEN" でなければなりません)

を修正するには https://developer.mozilla.org/En/Using_web_workers

--UPDATED

関連する問題