AngularJS:从 .then 内部返回一个承诺?

All*_*nph 5 javascript nested resolve promise angularjs

我有一个用户服务。我想创建一个方法来利用我构建的另一个服务。此服务有两种方法。getUser()getCurrentUser()getCurrentUser()利用获取 UID 的注入服务。它使用返回的 UID 来运行该getUser()方法。我的问题是我无法getCurrentUser()返回第二层承诺。

这个问题有点难以解释。这是代码...

svs.service("usersService", function($rootScope, $http, loginService, alertBoxService) {
  var self = this;
  self.getUser = function(identifier, column) {
    if (typeof(column) === 'undefined') column = "uid";
    return $http.get($rootScope.api + "/getUser/" + identifier + "/" + column);
  }
  self.getCurrentUser = function() {
    var currentUserPromise;
    loginService.getCurrentUid().then(
      function(response) {
        if (response.data === "false") {
          alertBoxService.trigger($rootScope.unexpectedApiResponse);
        } else {
          console.log(self.getUser(response.data));
          currentUserPromise = self.getUser(response.data);
        }
      }, function(response) {
        alertBoxService.trigger($rootScope.asyncFailed);
      }
    );
    return currentUserPromise;
  }
});
Run Code Online (Sandbox Code Playgroud)

Phi*_*hil 4

将承诺串联起来,但也不要忘记将拒绝串联起来......

self.getCurrentUser = function() {
    return loginService.getCurrentUid().then(function(response) {
        if (response.data === 'false') {
            alertBoxService.trigger($rootScope.unexpectedApiResponse);
            return $q.reject(response); // convert into a rejection
        }
        return self.getUser(response.data); // chain the promise resolution
    }, function(response) {
        alertBoxService.trigger($rootScope.asyncFailed);
        return $q.reject(response); // chain the rejections
    });
}
Run Code Online (Sandbox Code Playgroud)

$q当然,您需要注入该服务。


正如Bergi 善意指出的那样,您还可以通过抛出错误而不是使用来拒绝承诺$q.reject,例如

throw response;
Run Code Online (Sandbox Code Playgroud)

  • @Allenph,当通过“then”或“catch”的第二个参数处理承诺拒绝时,它会转换为已解决的承诺,除非该处理程序返回被拒绝的承诺或引发错误。这让上游消费者知道承诺被拒绝了。否则,他们就会认为这是成功的。 (2认同)