在角度创建空承诺?

Upv*_*ote 52 javascript angularjs

我想这样的事情:

var promise = IAmAEmptyPromise;

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

promise.then(function(){
    //do something
});
Run Code Online (Sandbox Code Playgroud)

所以我想声明一个可以使用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.
});
Run Code Online (Sandbox Code Playgroud)

但是,当用户在场时,这不起作用.有任何想法吗?

And*_*ahl 57

像Bixi写的那样,你可以使用$q.when()将承诺或价值包含在承诺中.如果你传递给的when()是一个promise,那么将返回,否则会创建一个新的promise,它将直接使用你传入的值来解决.像这样:

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.
});
Run Code Online (Sandbox Code Playgroud)

  • 或者它可以简化为`promise = $ q.when($ scope.user || UserService.create(params))` (9认同)

Ben*_*vis 16

使用本机es-6 promise时,可以使用Promise.resolve()创建一个立即解析的promise.这在撰写承诺时很有用.

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.');
});
Run Code Online (Sandbox Code Playgroud)