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

Mat*_*res 7 javascript asynchronous angularjs

上下文

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

GET方法需要检查用户是否有一个有效的(未过期)认证使得之前令牌get请求.因此,如果有,则发出请求,如果没有,请求令牌然后发出请求.

问题

get方法需要隐藏其复杂请求.它必须只返回一个Promise,因为它只发出一个请求.

所以,一个用法的例子:

UserService
    .get()
    .then(data => { ... })
    .catch(error => { ... })
Run Code Online (Sandbox Code Playgroud)

错误的解决方案

检查令牌是否已过期.如果是,则返回刷新令牌的请求,然后生成并返回get请求.如果不是,只需创建并返回get请求.如下:

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

但它正在回复我将要处理的承诺:

UserService
    .get()
    .then(request => {
        request // THAT IS NOT GOOD
            .then(data => { ... })
            .catch(error => { ... })
    })
    .catch(error => { ... })
Run Code Online (Sandbox Code Playgroud)

像使用示例一样!

正确的解决方案

如何在服务上创建这个get方法,它处理这样的身份验证并隐藏将要使用的控制器中的所有内容,让它在使用示例中使用它?

Ber*_*rgi 3

\n

但它返回了一个承诺,我必须这样处理:

\n\n
 UserService.get().then(request => { request.then(data => { \xe2\x80\xa6 }) })\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

不。

\n\n

Promise do chain,任何“承诺的承诺”都将隐式地扁平化为内部结果的承诺。您的“错误解决方案”代码只是按原样工作。

\n