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

时间:2016-08-31 05:59:20

标签: javascript angularjs nested promise resolve

我有一个用户服务。我想创建一个利用我建立的其他服务的方法。这项服务有两种方法。 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;
  }
});

3 个答案:

答案 0 :(得分:2)

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

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
    });
}

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

作为Bergi kindly pointed out,你也可以通过抛出错误而不是使用$q.reject来拒绝承诺,例如

throw response;

答案 1 :(得分:0)

这里的问题是当调用函数getCurrentUser时,它会立即返回undefined变量。这是因为服务是异步的,并且在服务上收到响应时,函数调用已经返回了undefined变量。为了防止这种情况,您可以在return内添加loginService来电。

答案 2 :(得分:0)

对于异步函数从成功回调内部返回一个promise,你必须从作为promise对象的回调返回,然后从main函数返回,以便向调用者提供promise。

试试这个。

  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() {
    return loginService.getCurrentUid().then(
      function(response) {
        if (response.data === "false") {
          alertBoxService.trigger($rootScope.unexpectedApiResponse);
        } else {
          console.log(self.getUser(response.data));
          return self.getUser(response.data);
        }
      }, function(response) {
        alertBoxService.trigger($rootScope.asyncFailed);
      }
    );
  }
});