2016-07-29 4 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

실수, 난 그냥 당신이 대상이었다 실현하지 않고 위의 코드를 복사됩니다. LOL.

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 } }) 
] 

편집 한

미안 통지를하지 않은 의견 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

'잡히지 않은 SyntaxError : 예기치 않은 토큰 :'. 그것이 객체가되어야한다고 확신 할 수는 없지만 JavaScript는 유효하지 않습니다. –

+0

음, 정직한 실수 @ 패트릭 로버츠를 읽어주세요 ** 편집 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 문을 배치하여 그 약속의에서 오류를 잡을 수는 한 번 약속, 같으면 아래의 모든 후속 약속을 실패 catch 문에 의해 실행될 수 있습니다.