0

私はこのコードを持っており、私のためにいくつかの操作を行う2つのjavascript関数を使用しています。1つの関数は計算を行いますが、他の何かを行う前に他の関数を呼び出します。他の関数がそれに戻ると、最終的な計算を行うことになっています。

問題:他の関数の呼び出しが正しく実行されていません。2番目の関数が戻る前でも、最初の関数は完全に実行されます。 コード:

firstfunction{

        secondfunction();

        do something more nothing related to second
     }

secondfunction(){

           setTimeout(func1(){
               do something independently
                 then call func1 depending on some condition
               },time);     
         }

2番目の関数は他の場所でも使用されており、正常に機能しています。

私の質問: このコードを使用したのは、2番目の関数が完全に実行される前に最初の関数が実行されないことを考えたためです。正しいですか?これは、JavaScript関数を実行する方法ではありませんか?最初の関数は、2番目が戻る前に完全に実行されます。2番目に戻った後、最初にグラフィックの位置がそのグラフィックを画面に配置することになっているので、私はこれを確信しています。しかし、最初のものは完全に実行され、グラフィックは画面上にぎこちなく配置され、視聴者は2番目のループによって与えられた正しい位置に移動するのを見ることができます。setTimeoutこの問題を引き起こしていますか?助けてください。

4

2 に答える 2

0

これは、を使用するために発生しますsetTimeoutsetTimeout非同期になります。間隔を設定すると2番目の機能の実行が完了し、実行フローは最初の機能に戻ります。したがって、最初の関数を分割して、最後のステップを持つ3番目の関数を作成する必要があります。setTimeoutこの3番目の関数は、ハンドラーから呼び出す必要があります。

     function firstfunction(){

        secondfunction(params);

     }

     function secondfunction(params){

           setTimeout(func1(){
               do something independently
                    then call thirdfunction depending on some condition
               },time);     
     }

     function thirdfunction(params){
         do something more nothing related to second
     }

このメソッドでは、すべてをパラメーターとして1つの関数から別の関数に渡す必要があります。

3番目のものをコールバック関数にすることで、これを別の方法で行うこともできます。このようにして、firstfunctionのスコープ内のすべてをthirdfunctionで使用できるようにすることができます。

     function firstfunction{

        secondfunction(thirdfunction);

        function thirdfunction(){
            do something more nothing related to second
        }

     }

     function secondfunction(callback){

           setTimeout(func1(){
               do something independently
                 then call callback depending on some condition
               },time);     
     }
于 2012-08-14T06:19:19.980 に答える
0

「2番目の関数が戻る前でも、最初の関数は完全に実行されます。」

いいえ、実際、2番目の関数は呼び出し直後に戻ります。タイムアウトが発生するのを待ちsetTimeout()ません。func1()渡した関数は、setTimeout()指定されたタイムアウト遅延の後に後で呼び出されますが、その間、実行は呼び出しに続くものすべてで続行されsetTimeout()ます(この場合、関数の終わりが続くので、最初の関数に戻り、次に最初の関数の残りに戻ります機能は継続します)。言い換えれば、setTimeout()実行を一時停止しません。

タイムアウトに何かが発生する必要がある場合は、渡す関数に配置するかsetTimeout()、その関数から呼び出す必要があります。

于 2012-08-14T06:19:22.387 に答える