2017-03-09 9 views
1

は私が怒鳴るようなコードを使用しようとしたpromise.then() 内部のいくつかの機能を平行に実行する必要があります()promise.then`内部で延期が、それは正しくない動作し解決する方法:いくつかは `

function fadeElement(selector){ 
     return function() { 
      return $(selector).fadeOut(400).promise(); 
     } 
} 

function runParallel(owner, promises) { 
    return function() { 
     var differed = new $.Deferred(); 
     var resolveDiffered = function() { differed.resolve(); }; 
     $.when.apply(owner, promises). 
      then(resolveDiffered); 
     return differed.promise(); 
    } 
} 

FormInput.prototype.ReloadPage = function(){ 
    var firstOne = fadeElement('#element_Id_1'); 
    var firstTwo = fadeElement('#element_Id_2'); 
    var firstThree = fadeElement('#element_Id_3'); 

    var secondOne = fadeElement('#element_Id_4'); 

    var thirdOne = fadeElement('#element_Id_5'); 
    var thirdTwo = fadeElement('#element_Id_6'); 

    $.when(firstOne(), firstTwo(), firstThree()) 
    .then(secondOne) 
    .then(
     runParallel(this, [thirdOne(), thirdTwo()]) 
    ); 
} 

firstOne,firstTwo,firstThree,secondOneは、400msの持続時間なしで実行される。

thirdOne,- 全く実行されません。

私はrunParallelに間違いがあると思うが、私はどこに注意を向けるべきか十分な知識はない。私は、このコードは動作しますbecouse、そう思う:

$.when(firstOne(), firstTwo(), firstThree()) 
.then(secondOne) 
.then(thirdOne) 
.then(thirdTwo); 
+0

、それだけでは以下となります。他の約束が完了したことが後まで、それぞれの約束生成関数が呼び出されたときの配置を変更すると、フェージングプロセスが遅延することができます関数を返す...その関数を実行しようとしましたか? –

+0

@Crisimいいえ、then()にはパラメータがあります。これは関数でなければならず、それはpromiseオブジェクトを返します。 –

+0

申し訳ありませんが、私は誤った.... –

答えて

1

問題は、あなたがrunParallelにこれらの機能を通過したときにthirdOnethirdTwoを呼び出す(したがって、フェージングプロセスを開始)していることである。

.then(
    runParallel(this, [thirdOne(), thirdTwo()]) 
); 

その代わりに、最後の()を削除し、関数をrunParallelに渡す必要があります。これは、各メソッドを呼び出した結果にマップする必要があります。 runParallelは何もしません

function fadeElement(selector) { 
 
    return function() { 
 
    return $(selector).fadeOut(400).promise(); 
 
    } 
 
} 
 

 
function runParallel(owner, promises) { 
 
    return function() { 
 
    return $.when.apply(owner, promises.map($.call, $.call)) 
 
    } 
 
} 
 

 
FormInput.prototype.ReloadPage = function() { 
 
    var firstOne = fadeElement('#element_Id_1'); 
 
    var firstTwo = fadeElement('#element_Id_2'); 
 
    var firstThree = fadeElement('#element_Id_3'); 
 

 
    var secondOne = fadeElement('#element_Id_4'); 
 

 
    var thirdOne = fadeElement('#element_Id_5'); 
 
    var thirdTwo = fadeElement('#element_Id_6'); 
 

 
    $.when(firstOne(), firstTwo(), firstThree()) 
 
    .then(secondOne) 
 
    .then(
 
     runParallel(this, [thirdOne, thirdTwo]) 
 
    ); 
 
} 
 

 

 
function FormInput() { 
 

 
} 
 

 
new FormInput().ReloadPage()
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="element_Id_1">1</div> 
 
<div id="element_Id_2">2</div> 
 
<div id="element_Id_3">3</div> 
 
<div id="element_Id_4">4</div> 
 
<div id="element_Id_5">5</div> 
 
<div id="element_Id_6">6</div>

+1

ソリューションの解答と詳細な説明に感謝します。 –

+0

喜んで助けてください!あなたのプロジェクトの残りの部分で幸運を祈ってください。 – gyre

関連する問題