2014-07-23 2 views
7

서비스에 의해 반환되는 일부 약속을 연결하고 싶습니다. 이것은 약속을 되 돌리는 일부 메소드가 추가 매개 변수를 요구하지 않는 한 작동합니다. 이것은 내 예입니다.AngularJS : 체인 된 약속에 추가 매개 변수 전달

var first = function() { 
    var d = $q.defer(); 
    $timeout(function() { 
    d.resolve("first resolved") 
    }, 100) 
    return d.promise; 
}; 

var second = function(val) { 
    console.log("value of val: ", val); 
    var d = $q.defer(); 
    $timeout(function() { 
    d.resolve("second resolved") 
    }, 200) 
    return d.promise; 
}; 

first().then(second).then(function(value) { 
    console.log("all resolved", value); 
}); 

이것은 예상대로 작동합니다. 하지만 내 서비스 second에 추가 매개 변수 val이 필요하면 어떻게해야합니까? 위의 방법을 사용하면 val의 값은 에서 확인 된 값이되므로 "first resolved"입니다.

주변에 어떤 방법은 다음과 같이 익명 함수를 중첩하지 않고, 거기 :

first().then(function() { 
    return second("foobar").then(function(value) { 
    console.log("all resolved", value); 
    }); 
}); 

내가 $q.all 사용에 대한 생각,하지만 이럴 당신이 당신의 약속에 대한 순서를 지정할 수 없습니다.

+0

는'$의 timeout' 이미 약속, 내가 알고있는'$ q.defer'there –

+0

에 대한 필요를 반환, 그냥했다 데모 용. 내 실제 경우에는 HTTP 호출이 있고 그 후에 데이터로 일부 처리를 수행합니다. 그래서 나는 여분의'$ q.defer'를 필요로한다. – 23tux

+0

어 ... $ http는 이미 약속을 되 돌리며, 여분의 처리를 위해'.then' 할 수 있고, 코드에 대한 판단을 내릴 수 없다. 나는 보지 못했지만 연기 된 반 패턴과 같은 것이 아직도있다. 그것을 약속 할 때 콜백 API에 대해 작업 할 때는'$ q.defer' 만 필요합니다. –

답변

10

물론. 첫 번째 방법 :

first() 
    .then(function() { 
    return second("foobar"); 
    }) 
    .then(function(value) { 
    console.log("all resolved", value); 
    }); 

둘째 (더 쉽게) 방법 :

first() 
    .then(second.bind(null, "foobar")) 
    .then(function(value) { 
    console.log("all resolved", value); 
    }); 
+0

는 매력처럼 작동합니다! 감사! – 23tux

+0

당신을 진심으로 환영합니다. 중요한 점은 약속을 통해서만 호출 할 수있는 기능을 항상 기억해야한다는 것입니다. 따라서 추가 매개 변수가 필요하거나 주어진 값으로 무언가를 할 필요가 있다면, 그것을 랩핑하거나 바인딩하고 'then' 호출에 일반 함수를 전달해야합니다. 그리고 함수는 또 다른 약속을 반환 할 수 있습니다. – Razem