2016-07-29 38 views
4

$q#allメソッドを使用して約束を返す問題に直面しています。返品約束

私はお互いに約束は依存したい

すなわち

私はobj1, obj2 and obj3を設定した場合、私は同じでそれらを取得したいです。

どうすればこの問題を解決できますか?

Factory:

mainFactory.$inject = ['$http', '$q']; 

function mainFactory($http, $q) { 
    var mainFactory = { 
    getPromises: getPromises 
    }; 

    return mainFactory; 

    function getPromises(id) { 
    promises = { 
     'obj1': $http.get('http1'), 
     'obj2': $http.get('http2'), 
     'obj3': $http.get('http3'), 
     'obj4': $http.get('http4', { params: { 'id': id } }), 
     'obj5': $http.get('http5'), 
     'obj6': $http.get('http6', { params: { 'id': id } }) 
    }; 

    return $q.all(promises); 
    } 
} 

Controller:

MainCtrl.$inject = ['mainFactory']; 

function MainCtrl(mainFactory) { 
    var vm = this; 
    mainFactory.getPromises(id) 
    .then(getResponse) 
    .catch(getError); 

    function getResponse(response) { 
    var keys = Object.keys(response), i = keys.length; 
    while (i--) { 
     var key = keys[i]; 
     console.log(key); // I want all the keys in order, i.e. => obj1, obj2.. and so on 
     var value = response[key].data; 
     switch(key) { 
     ... 
     } 
    } 
    } 

    function getError(error) { 
    console.log(error); 
    } 
} 

編集:私もこの方法を試してみました

var promises = {}; 
return $http.get('/admin/http1.json').then(function (value) { 
    promises['obj1'] = value; 
    }) 
.then(function (result) { 
    return $http.get('/admin/http2.json').then(function (value) { 
    promises['obj2'] = value; 
    }); 
}).then(function (result) { 
    return $http.get('/admin/http3.json').then(function (value) { 
    promises['obj3'] = value; 
    }); 
});  
return $q.all(promises); 
+1

私は約束していません、申し訳ありませんが、代わりにhttp://caolan.github.io/async/docs.html#.eachOfSeries – Plato

+6

を使用することです。オブジェクトキーは本質的に*順序付けられていません*。代わりに配列を使用してください。 –

+0

$ q.serial()でこの記事をチェックしてください。私はそれがまさにあなたが探しているものだと思う。 http://www.codeducky.org/q-serial/ – mhodges

答えて

1

編集2

間違い、私はちょうどあなたがそれが目的であった実現することなく、上記のコードをコピー。笑。

promises = [ 
    $http.get('http1'), 
    $http.get('http2'), 
    $http.get('http3'), 
    $http.get('http4', { params: { 'id': id } }), 
    $http.get('http5'), 
    $http.get('http6', { params: { 'id': id } }) 
] 

編集1

申し訳ありませんが、私は気付かなかったのコメントJared Smithは、書き込みです。

Object keys are inherently unordered. Use an array instead.

編集0

オブジェクトのキーは、文句を言わない注文します。あなたの約束を宣言するために配列を使用してください。順不同の各約束を解決します$q.allを使用して

promises = [ 
    $http.get('http1'), 
    $http.get('http2'), 
    $http.get('http3'), 
    $http.get('http4', { params: { 'id': id } }), 
    $http.get('http5'), 
    $http.get('http6', { params: { 'id': id } }) 
] 

$q.all(promises) 
    .then(functions(resolves){ 
     // resolves here is an array 
    }).catch(function(err){ 
     // throw err 
    }); 
+0

'Uncaught SyntaxError:予期しないトークン:'。それがオブジェクトであるはずだったのかどうかはわかりませんが、間違いなく有効なJavaScriptです。 –

+0

正直な間違い@PatrickRobertsを読んでください**編集2 ** – CENT1PEDE

1

。それぞれの約束が解決された後でそれらを実行したい場合は、プロミスチェンジを使用してください。

function getPromises(id) { 
    var getObjA = function() { 
    return $http.get('http1'); 
    }; 

    var getObjB = function() { 
    return $http.get('http2'); 
    }; 

    var getObjC = function() { 
    return $http.get('http3'); 
    }; 

    var getObjD = function() { 
    return $http.get('http4', { params: { 'id': id } }); 
    }; 

    var getObjE = function() { 
    return $http.get('http5'); 
    }; 

    var getObjF = function() { 
    return $http.get('http5', { params: { 'id': id } }); 
    }; 

    return getObjA() 
    .then(getObjB) 
    .then(getObjC) 
    .then(getObjD) 
    .then(getObjE) 
    .then(getObjF); 
} 

編集:追加情報として、あなたはここに

getPromises("id") 
    .then(<success callback here>) 
    .catch(<error callback that will catch error on any of the promises>); 

意味をcatchステートメントを配置することによって、それらの約束のいずれかのいずれかのエラーをキャッチすることができますが、一度約束は、wouldn以下のすべての後続の約束を失敗します