内部解析函数返回诺言作为其延续

上下文

我正在和Angular合作。 我有一个名为UserService的服务,用于处理登录,身份验证和用户数据请求。

get请求之前, get方法需要检查用户是否有用于认证的有效(未过期)令牌。 所以,如果有的话,做出请求,如果没有请求一个令牌, 然后发出请求。

问题

这个get方法需要隐藏它的复杂请求。 它只能返回一个Promise,因为它只提出一个请求。

所以,一个使用的例子:

UserService
    .get()
    .then(data => { ... })
    .catch(error => { ... })

错误的解决方案

检查令牌是否过期。 如果是,则返回刷新令牌的请求,并在那里创建并返回获取请求。 如果不是,只需制作并返回获取请求。 如下:

function get() {
    if (isTokenExpired(token))
        return $http
            .post(url + '/refreshtoken', 'token=' + refreshToken)
            .then(response => {
                token = response.data.token
                return $http.get(url + '?token=' + token)
            })
            .catch(response => { ... })
    else
        return $http.get(url + '?token=' + token)
}

但它回复了我将不得不像这样处理的一个承诺:

UserService
    .get()
    .then(request => {
        request // THAT IS NOT GOOD
            .then(data => { ... })
            .catch(error => { ... })
    })
    .catch(error => { ... })

像使用示例一样!

正确的解决方案

如何让服务获得方法,处理这种认证,并隐藏将使用的控制器的所有内容,让它像使用示例中那样?


但是,它承诺我将不得不像这样处理一个承诺:

 UserService.get().then(request => { request.then(data => { … }) })

没有。

承诺做链条,任何“承诺承诺”都将被隐含地平息为对内在结果的承诺。 你的“错误解决方案”代码只是按原样工作。


这是一个例子。 基本上你需要转换一个额外的.then()

angular.module('app', [])
  .service('UserService', function($http) {
    let url = 'https://jsonplaceholder.typicode.com';

    function getUserData(token) {
      return $http.get(url + '/users/1', {
          token: token
        })
        .then(resp => resp.data);
    }

    this.get = function(tokenIsValid) {
      if (!tokenIsValid){
        console.log('refreshing');
        return $http.post(url + '/posts', {
            refreshToken: 'rt'
          })
          .then(getUserData)
        }
      return getUserData();
    }
    return this;
  })
  .run(function($rootScope, UserService) {
    $rootScope.get = (valid) => {
      console.log('Getting with ' + (valid? '':'in') + 'valid token');
      UserService.get(valid)
        .then(console.log)
        .catch(console.error);
    }
  });
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app">
  <button ng-click="get()">Get invalid</button>
  <button ng-click="get(true)">Get valid</button>
</div>
链接地址: http://www.djcxy.com/p/37789.html

上一篇: Return promise inside resolve function as its continuation

下一篇: gridster c3 charts auto resizing issue