我想这样的事情:
var promise = IAmAEmptyPromise;
if(condition){
promise = ApiService.getRealPromise();
}
promise.then(function(){
//do something
});
所以我想声明一个可以使用then解决的promise。但是,这个承诺可能会被另一个返回内容的承诺所覆盖。后来我想解决它是否有内容的承诺。这可能吗?我尝试过:
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 :(得分:56)
像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.
});
答案 1 :(得分:16)
使用本机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.');
});