2014-03-19 32 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(),其中包含承諾或價值承諾。如果您傳遞給when()的是一個承諾,那將得到恢復,否則新的承諾,創建其直接與你在像這樣的東西傳遞的值解析:

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

當使用本機ES-6的承諾,你可以使用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

真棒,我使用ES6,我不再需要注入'$ q'。 – Jelle