2012-02-29 5 views
1

私は既存の関数にいくつかの機能を追加しようとしています。私は、現在のルーチンの途中に追加のステップを挿入する必要があります。私は第2の関数に行く方法を知っていますが、第2のルーチンが完了すると主関数に戻るために何をすべきか分かりません。JS機能を使って何かをしてから、そのプロセスが完了したら戻すにはどうすればいいですか?

function step1(){ 
    perform ajax call to see if student is assigned to a project 
    step1_subfunction() 
    // wait here until step1_subfunction is done 
    do some more stuff with response from user 
} 

function step1_subfunction(){ 
    prompt user via jQuery dialog, 'Add or move employee to the project?' 
    // return to step1 with answer returned from user and resume 
} 

この「プロセス」に名前があるかどうかはわかりませんが、 COBOLの私の時代に、私たちはこのゴッサブと呼ばれました。

更新: 手順1は、従業員がプロジェクトに割り当てられているかどうかを確認するためにajax呼び出しを実行します。 response.status = 'Assigned'の場合、 jQueryダイアログボックスで「このプロジェクトに従業員をコピーまたは移動しますか?」というメッセージが表示されます。 jQueryダイアログボックスはstep1_subroutineになります。答えはstep1関数に返されます。 step1の残りの部分は単に "コピー"または "移動"の隠しテキストフィールドに値を配置することになります。

+1

'step1_subfunction'が非同期コードを実行しない限り、それは正確に動作します – scibuff

+0

@scibuffは偶然にもajaxコールのようですか? – HPWD

+0

@dlackey:うん。 'step1_subfunction'にはAJAX呼び出しが含まれていますが、これは動作しません。 –

答えて

0

あなたが持っているものはあなたが何を記述しているのでしょうか?関数step1()の中で関数step1_subfunction()で返されることなくユーザーからのデータを利用できないかもしれません。以下では、値渡しを示すためにサンプルコードを変更しました。

function step1(){ 
    //do some stuff 
    var returnValFromFunction = step1_subfunction(); 
    // wait here until step1_subfunction is done 
    // Now use returnValFromFunction, it contains the information from the user 
    do some more stuff with response from user 
} 

function step1_subfunction(){ 
    prompt user for some information 
    // return to step1 with information returned from user and resume 
    return userResponse; 
} 
+0

私は "リターン"の使用を読んで、これは私が必要なものに見えます。ありがとう、@波 – HPWD

0

あなたが書いたものはうまくいくはずです - javascriptはシングルスレッドなので試しましたか?

Javascriptにはサブルーチンがありません。実行したように結果を返して無視する関数を作成するだけです。 2番目のルーチンが完了すると、スコープと実行は最初の関数で継続されます。

+0

私はスケルトンを書きましたが、それはシングルスレッドになっていましたが、この既存のプロシージャを調整する前に、私のロジックが正しいことを確認したかったのです。 – HPWD

0

ただ何もしません。あなたが達成しようとしているものを

ので、それが自動的にそれに戻ります単に「関数呼び出し」

で実行後、呼び出し元「スタックフレーム」です。

0

ajaxオブジェクトを同期させることができます。IEでは、応答が得られるまでコードは継続されません。これはopenの3番目のパラメータです(trueは非同期、falseは同期)。

xmlhttpobject.open('POST', 'url', false); 

同期呼び出しが正常な場合がありますが、可能な場合は常に避ける必要があります。

あなたのコードにいくつかのロジック変更が必要になるかもしれないが、長期的にはより良い方法である他の方法は、onReadyStateChangeイベントをバインドすることです。これは、xmlHttpRequestオブジェクトの状態が変化するたびに発生します。ステータスが200で、readystateが4であることを確認して、要求が完了して正常に完了したことを確認できます。

Here'sより良い参照。がんばろう。

関連する問題