2016-10-03 18 views
0

以下の例は、 なぜ関数間で非同期になる引数を持つ関数fct1を呼び出したのですか?機能の 実行は順序です:fct3、fct2、fct1代わりfct1、fct2、としてfct3パラメータを使用した非同期呼び出しの呼び出し方法

function fct1(param1) { 
    var d = $.Deferred(); 
    setTimeout(function() { 
     console.log("fct1 : param1 =" + param1); 
     d.resolve(); 
    }, 3000); 
    return d.promise(); 
}; 


function fct2() { 
    var d = $.Deferred(); 
    setTimeout(function() { 
     console.log("fct2"); 
     d.resolve(); 
    }, 2000); 
    return d.promise(); 
}; 

function fct3() { 
    var d = $.Deferred(); 
    setTimeout(function() { 
     console.log("fct3"); 
     d.resolve(); 
    }, 1000); 
    return d.promise(); 
}; 


var fct_array = [fct1(1), fct2, fct3]; 

var d = $.Deferred().resolve(); 
while (fct_array.length > 0) { 
    d = d.then(fct_array.shift()); 
} 
+0

それはだ "非同期" ではない "同期"それは最初の方が速いことを意味します... fct3は1000 fct2は2000 fct3は3000なので、すべてが完璧に動作します。 –

+0

多分、タイムアウト –

+0

のために、これらの関数をパラメータ(fct1、fct2、fct3)で順番に実行したいのですが、関数fc1のパラメータを追加すると関数間の同期が失われる理由がわかりません。 – collo21

答えて

2

あなたFCTL()関数の定義を変更します。

function fct1(param){ 

    var p =param; 
    var f = function(p){ 
     var d = $.Deferred(); 
     setTimeout(function() { 
       console.log("fct1 : p=" + p); 
      d.resolve(); 
     }, 5000); 
     return d.promise(); 
    } 

    return f.bind(this,p); 
}; 

理由はされているあなたの場所の前に配列fct_arrayを初期化するときに関数fctl(1)を実行しています。したがって、後で.thenを呼び出す1つは既に解決されました。

注:あなたはこのようにd=d.then(fct_array.shift()); としてオブジェクトdを再初期化するようwhileループを変更する必要はありません、

while (fct_array.length > 0) { 
    d = d.then(fct_array.shift()); 
} 

/* is equal to : 
d=d.then(fct_array.shift()).then(fct_array.shift()).then(fct_array.shift()); 
*/ 

実装JSBin

+0

私はどのように関数間の同期を失うことなくパラメータを使ってfct1を呼び出すことができますか?私はあなたの応答をテストする私は同期を失う! – collo21

+0

あなたのポイントを得ました。ループがうまくいけば、 – Nivesh

+0

秒を与えてください。単純にfctl(param)関数の定義を変更してください。 – Nivesh

関連する問題