2011-07-02 9 views
0

JavaScriptのコードを非常に読みやすくしながら別の関数を呼び出す前に、関数の実行を一時停止する方法を解明しようとしています。 、私はのsetTimeoutを使用する方法についての記事の数十を読んだ外部待機クラスを使用してJavaScript関数の実行を一時停止する

function main_function(){ 
    function a(); 
    // wait for function a to finish - could take 1 second - could take 3 seconds 

    function b(); 
    // wait for function b to finish - don't know how long this will take 

    function c(); 
    // completed 
} 

他の機能、コールバックなどにリダイレクトしますが、実際に働いていた解決策を見つけることができませんでした:ここで私が何をしようとしています何の例です。 (ほとんどの場合、ちょうどそれぞれの関数がどれくらいの時間を取るか分からないので、実際には役に立たないcloneyなsetTimeout()を使用します)。

私は最終的に "WaitThread.js"という小さなユーティリティを見つけました。これはまさに私がやる必要があるようで、後で読むと維持するのが簡単なように思えます。

しかし、私はそれを使用する方法を理解できません! :)

誰も私にこのWaitThread.jsの使用方法の例を教えてもらえますか?または、少なくとも私は最初に終わるのを待っている間、次々に実行するjavascript関数を待つ読み込み可能な/エレガントな方法を提供しますか?

http://www.robertmayo.com/blog/2006/07/htmljavascript-wait-for-asynchronous.html

ありがとう:ここ

はWaitThread.jsページへのリンクです!

+0

その解決策は本当に魔法でも何でもありません。それは、ウォッチドッグタイマーを使ってある状態の変化をポーリングすることだけです。 Webブラウザでは、JavaScriptコードで「待機」することはありません。問題にアプローチする唯一の方法は、非同期プログラミングモデルを取り入れることです。 – Pointy

+0

また、これらの機能が何をしているのか、そしてそれが何をして長時間かかるのかについて詳しく説明すると、いくつかの説明と示唆を与えるのに役立ちます。 – Pointy

答えて

1

waitthread.jsの説明によれば、タイマーを使ってポーリングを行い、ある変数の値の変更を待っているだけです。

このタイプの問題のより典型的なデザインパターンは、コールバックを使用し、function aは、作業が完了したときにコールバックを呼び出し、function bを開始します。したがって、function aに関数を渡します。function aは、その作業が終了したときに呼び出されます。より完全なデザインパターンは通常、成功した終了と失敗した終了の両方のためのコールバックを持ち、出口からパラメータを渡すことさえできますが、私はあなたの詳細を知らないので、ここでモデル化しようとはしませんでした。多段階プロセスの場合、このようになります。

function main_function_step1() { 
    a(main_function_step2); 
} 

function main_function_step2() { 
    // execute code here that goes after function a, but before function b 
    b(main_function_step3); 
} 

function main_function_step3() { 
    // execute code here that goes after function b, but before function c 
    c(main_function_finish); 
} 

function main_function_finish() 
{ 
    // execute whatever code here to finish 
} 

より完全なソリューションを持つオブジェクトを渡します。我々は、bとcを機能し、それぞれが非同期関数が完了したときに呼び出される関数を引数として取るよう3つの非同期関数が存在することを前提としてい成功コールバックおよび失敗コールバックを返し、各関数に少なくとも1つのパラメータを提供し、結果またはエラー条件を返すことができます。その場合

、それは次のようになります。

function main_function_step1() { 
    function main_function_a_step1_fail(err) 
    { 
    // handle error in step 1 
    } 
    var o = {success: main_function_step2, fail: main_function_a_step1_fail}; 
    a(o); 
} 

function main_function_step2(data) { 
    // execute code here that goes after function a, but before function b 
    function main_function_a_step2_fail(err) 
    { 
    // handle error in step 2 
    } 
    var o = {success: main_function_step3, fail: main_function_a_step2_fail}; 
    b(o); 
} 

function main_function_step3(data) { 
    // execute code here that goes after function b, but before function c 
    function main_function_a_step3_fail(err) 
    { 
    // handle error in step 3 
    } 
    var o = {success: main_function_finish, fail: main_function_a_step3_fail}; 
    c(o); 
} 

function main_function_finish(data) 
{ 
    // execute whatever code here to finish 
} 

これは、コードに少し厄介ですが、それには、ポーリングまたはグローバル変数を必要としません。ステップ間で実行するコードがなく、それらの間のロジックがすべて同じ場合、データ構造内のすべてをパラメータ化し、データ構造から1つの項目を実行し、次のデータを渡すただ1つの関数ですべてのステップを実行できますコールバックなどの値。

+0

jfriend00 - フィードバックありがとう!これはかなり良く見えます。しかし、それはまだあなたのコメントに記載されているようにちょっと乱雑に見えます。 WaitThread.jsファイルをどのように使用するかの例を私に教えてもらえますか?それで、どのように動作するのかを確認して、後ほど、あなたがここに示したモデルに準拠するように修正することができます。ありがとう! – swhitlow

+0

Pointy - 機能は、IDカードをスキャンするJavaアプリケーションを呼び出します。これが行われている間、スクリプトは待つ必要があります。それが完了すると(つまり、イメージファイルが実際に存在するとき)、Javaアプレットの周りに別のjavascriptラッパーが使用され、イメージをFTPに送信してサーバーに送信します。これが完了すると、スキャンされたライセンスからデータが解析されます。私はPHPとC#をよく知っています。しかし、javascript(私は - 高度なjavascriptを言う必要があります)少し私には新しいです。私はスクリプトを呼び出してそれが完了するのを待つことができないという事実の周りに私の頭を得るために少しかかります、そして、私の次のスクリプトを呼び出します。 – swhitlow

+0

私はajax呼び出しを呼び出している(つまり、何らかの処理を行うためにPHPファイルを呼び出す)場合、これを行うことができますが、私は内部のjavascript関数を呼び出すときにこれを行うことはできません。 – swhitlow

関連する問題