1

次の構造を持つコードがあります。基本的に私の要件は、「SELECT」f5 のオプションの onChange を実行し、その後に f1 を実行することです。そして f1 の内部では、最初に f2 を実行する必要があり、完了したら f3 を実行する必要があります。f2 の完了は、f4 が実行されて完了していることも確認する必要があることを意味します。フローを維持するという意味です。先に終了する関数が残っていると、プログラム全体が無駄になります。deferred には解決策があると思うので、パイプで使用してみました。しかし、私はこのフローを維持することに精通していないため、期待した結果を得ることができません。できれば助けてください。

<script>
function f1(){
   function f2(){
      ....
      f4();
      ....
   }
   function f3(){
      ....
   }
}

function f4(){}
function f5(){}
</script>
 ....
<select onChange=f5().pipe(f1) >
......
</select>
4

3 に答える 3

2

編集:関数で$.ajaxを使用しているようです。AJAXクエリの完了後に何かを実行したい場合は、クエリが戻ったときに実行されるコールバックとして設定できます。たとえば、次のように、他の関数の観点からf2を定義できます。

function f2()
{
    g();
    f4();
    h();
}

f4がAJAXを使用する場合、次のように定義を変更できます。

function f2()
{
    g();
    f4();
}
function f4()
{
    $.ajax("http://url.com").done(function(){
            h();
            f3();
        });
}

このdone()関数を使用すると、クエリが正常に返されるとすぐに実行する1つの関数(この場合は匿名関数)を設定できます。このようにf2を定義すると、f1は不要になるため、別の関数を定義できます。

function f6()
{
    f5();
    f2();
}

次に、onChangeイベントを次のように変更できます。

<select onChange="f6()"></select>

また、mattmanserが投稿したように、このコードfunction f(){}は関数を定義するだけで、実行しないことにも注意してください。関数を定義した直後に実行したい場合は、代わりにクロージャを使用できます。

(function f ()
{

})()
于 2013-01-15T11:06:09.970 に答える
0

まあ、それを完全に達成するのは難しいでしょう。mattmanser が既に書いたように、関数宣言はすべての関数が順番に呼び出されることを保証します。あなたの質問で明確でないのは、間に I/O コールバックがあるかどうかです。f2 で $.get を使用してサイトから特定の HTML ページをフェッチするとします。その呼び出しの下にさらにコードがある場合、これはフェッチと並行して実行されます...このコードを $.get 成功コールバック内にパックしない限り。したがって、理論的には、javascript のすべての関数呼び出しは順次呼び出されますが、コールバック メカニズムでは、処理が並行して実行されないことは保証されません。

于 2013-01-15T11:06:54.550 に答える
0

関数の宣言と関数の実行を混同しています。関数を宣言する順序は関係ありません。関数を呼び出す順序だけです。宣言:

function a() {
    console.log("a");
}

function c() {
    console.log("c");
}

function b() {
    console.log("b");
}

function runAll() {
    a();
    b();
    c();
}

a(); //will print a
runAll(); //will print a b c on different lines

Javascriptも非同期ではありません。関数の呼び出しがブロックされている場合、プログラムの実行は関数が終了するまで続行されません。上記の例では、 の実行が完了runAllするまで実行されません。a

これに対する唯一の例外は、jQuery.ajax などの非同期 jQuery コードを呼び出す場合です。

于 2013-01-15T11:00:38.560 に答える