2014-10-29 2 views
1

나는 다리 당 비동기 작업이 개 별도의 덩어리로, 단계의 두 시리즈를 분기 오전 :

Time   Threads forking and joining: 
|       * 
|      / \ 
V     / \ 
       +-----+  +-----+ 
       /     \ 
      /      \ 
     $http.get('/foo')   $http.get('/baz') 
       |       | 
       V       V 
     $http.get('/bar')   $http.get('/blap') <-- Problem children 
       |       | 
       V       V 
       \      /
       \     /
       +------+  +------+ 
         \ /
          \/
          + 
          | 
        $log.log("Carry on") 

는 "문제 아이 수준"는에 $q.defer()를 사용하지 않고 결합/위의 포크 (fork)를 할 수 있습니까?

내가/위의 포크를 할 당신은 체인에 다음 기능의 내부 약속을 반환 할 수 있습니다 $q.defer()

var left = $q.defer() 
var right = $q.defer() 
$http.get('/foo') 
    .success(function() { 
    $http.get('/bar') 
     .success(function() { 
     left.resolve() 
     }) 
    }) 
$http.get('/baz') 
    .success(function() { 
    $http.get('/blap') 
     .success(function() { 
     right.resolve() 
     }) 
    }) 

$q.all([left.promise,right.promise]) 
    .then(function() { 
    $log.log("Carry on") 
    }) 
+0

무엇 코드를 어떻게 보이게할까요? – John

+0

'$ q.defer()'객체를 명시 적으로 관리하지 않고 약속들을 연결할 수 있습니까? –

답변

3

와 결합 할 것입니다 어떻게 그들을

var promise1 = $http.get('/foo') 
    .then(function() { 
    return $http.get('/bar'); 
    }) 
var promise2 = $http.get('/baz') 
    .then(function() { 
    return $http.get('/blap'); 
    }); 

$q.all([promise1,promise2]).then(function(results){ 
    var promise1Result = results[0]; // result of /bar 
    var promise2Result = results[1]; // result of /blap 
    // .... and do stuff 
}); 

데모 : http://jsfiddle.net/k9h4v1vv/

+2

'.success()'함수를 사용하면 안됩니다. – Bergi

+0

'.success()'가 작동하지 않는 것은 키커였습니다. 감사. –