2014-03-19 2 views
46

나는 이런 식으로 뭔가에 대한 것입니다 :각도로 빈 약속을 만드시겠습니까?

var promise = IAmAEmptyPromise; 

if(condition){ 
    promise = ApiService.getRealPromise(); 
} 

promise.then(function(){ 
    //do something 
}); 

그래서 그때 사용하여 해결 할 수있는 약속을 선언하고자합니다. 그러나이 약속은 내용을 반환하는 또 다른 약속으로 덮어 쓸 수 있습니다. 나중에 나는 그것이 내용이 있든 없든 약속을 해결하고 싶다. 이것이 가능한가? 나는 다음과 같이 시도했다 :

var promise = $q.defer().promise; 

if(!$scope.user){ 
    promise = UserService.create(params); 
} 

promise.then(function(){ 
    //either user was created or the user already exists. 
}); 

그러나 사용자가있을 때는 작동하지 않는다. 어떤 아이디어?

+0

어쩌면 $ q.when()가 당신을 도울 수 : http://docs.angularjs.org/api/ng/service/$q –

답변

53

Bixi가 쓴 것처럼, 당신은 약속이나 가치를 약속으로 포장하는 $q.when()을 사용할 수 있습니다. 기본 ES-6 약속을 사용하는 경우

var promise; 
if(!$scope.user){ 
    promise = UserService.create(params); 
} else { 
    promise = $q.when($scope.user); 
} 

promise.then(function(user){ 
    //either user was created or the user already exists. 
}); 
+9

하거나 단순화 할 수 있습니다 단지'약속 = $ q.when ($ scope.user || UserService.create (params))' – doodeec

15

:. 당신이 when()에 전달하면 이런 식으로 뭔가에 전달 된 값과 직접 해결 그렇지 않으면 새로운 약속을 만들어 반환 얻을 것이다 약속은 경우 Promise.resolve()를 사용하여 즉시 해결 된 약속을 만들 수 있습니다. 이것은 약속을 작성할 때 유용합니다.

var p = Promise.resolve(); 
for (var i=0; i<something.length; i++) { 
    p = p.then(UserService.create(newUsers[i])); 
} 
p.catch(function(e) { 
    console.error('oops: ', e); 
}).then(function() { 
    console.log('done.'); 
}); 
+0

awesome, 나는 ES6을 사용하고 있으며 더 이상'$ q'를 삽입 할 필요가 없습니다. – Jelle

관련 문제