2017-01-05 17 views
0

私は、私のビューが読み込まれるときに行われる約5つの要求があります。これは、編集フォームのためです:

var reqA = function() {...}; 
var reqB = function() {...}; 
var reqC = function() {...}; 
var reqD = function() {...}; 
var reqE = function() {...}; 

は今、私はreqA()reqB()は非同期にロードし、可能な場合は、単一の約束を返すようにしたいです。

reqC()reqD()reqA()reqB()が終了した後をロードし、その約束を実行する必要があります。

reqE()は、 およびreqD()の後にをロードする必要があります。

これは私がやりたがっていることですが、どのように動くかわかりません。私はそれらをすべて非同期にロードすることができます。

+0

チェックアウト '$のq'モジュールあなたが約束の配列の後に解決する約束を作成するには、' $のq.allを() 'を使用することができ – reptilicus

+2

:それらまでは一つの方法または他に約束を戻します解決する。例えば'$ q.all([reqA()、reqB()])then(()=> reqC())' – rob

+0

@robがあなたのコードを試しました。あなたはもっと説明してください。 – user3718908

答えて

2

すべての機能が$httpプロバイダーを使用している場合は、簡単に達成できます。あなたは今、彼らは約束を戻ってきていることを、この

function reqA() { 
    return $http.get(...); 
} 

よう$http呼び出しの結果を返すために、あなたの機能を変更したいと思うでしょう、あなたは簡単にあなたの要求を編成するために$ qをプロバイダを使用することができます。

$q.all([reqA(), reqB()]) 
.then(() => 
    $q.all([reqC(), reqD()]) 
    .then(() => reqE()) 
); 

は、通常のJS(非ES6)の場合:あなたの関数で$httpの結果を返すようにしたくない場合は

$q.all([reqA(), reqB()]) 
.then(function() { 
    $q.all([reqC, reqD()]) 
    .then(function() { 
    reqE(); 
    }); 
}); 

、あなたが設定する必要があります

function reqA() { 
    var deferred = $q.defer(); 
    ... your request code ... 
    // call this if everything is ok 
    deferred.resolve(); 
    // call this if there was an error 
    deferred.reject(); 
    return deferred.promise; 
} 
+0

ありがとう、あなたの答えは私を大いに助けました、私はこの "$ q"のことをよりよく理解するために読んでいます。 :) – user3718908

0

ここにはexampleがあります。これを見ると、より明確になる可能性があります。 Promiseを使用しています。これは、ほぼすべてのJavaScript環境(IEおよび古いノードのバージョンを除く)でグローバルに使用できます。

angular 
    .module('example', []) 
    .run(function($q) { 
    function requestOne() { 
     return $q.when("one") 
    } 

    function requestTwo() { 
     return $q.when("two") 
    } 

    function requestThree() { 
     return $q.when("three") 
    } 

    function requestFour() { 
     return $q.when("four") 
    } 

    function requestFive() { 
     return $q.when("five") 
    } 

    $q 
     .all([requestOne(), requestTwo()]) 
     .then(function(responses){ 
     console.log(responses[0] === "one"); 
     console.log(responses[1] === "two"); 

     return $q.all([requestThree(), requestFour()]); 
     }) 
     .then(function(nextResponses){ 
     console.log(nextResponses[0] === "three"); 
     console.log(nextResponses[1] === "four") 

     return requestFive(); 
     }) 
     .then(function(lastResponse){ 
     console.log(lastResponse === "five") 
     }) 
}); 

angular.element(document).ready(function() { 
    angular.bootstrap(document, [ 'example' ]); 
}); 

私はあなたが存在しない場合Promiseは、ほぼすべての環境でグローバルスコープで利用可能で、あなたが角度1を使用していることを前提としています。

関連する問題