【问题标题】:Wait promise finish in outer function在外部函数中等待承诺完成
【发布时间】:2016-09-07 07:15:10
【问题描述】:

我正在使用 Ionic2 + Laravel。 我正在尝试制作一个“拦截器”,它将在我的所有 Http 请求中将来自 LocalStorage 的身份验证令牌 (JWT) 放在 Header 上。

所以,我用一个方法做了一个服务:

post(url : string, json : any) : Observable <\Response> {

    var headers = new Headers();
    var token = null;
    this.local.get("token").then( (tk) => {
        headers.append('Authorization', 'Bearer ' + tk);
        var options = new RequestOptions({headers: headers});
        token = tk;
    });

    -> wait the 'token' != null <-
    return this.http.post(url, JSON.stringify( json ), options);
}

问题是:
当从该服务调用 post() 时,我期待“Observable http.post()”返回。
但是,我需要“this.local.get()”承诺完成解析,因为我需要 LocalStorage 中的令牌附加到 Header 上。

我怎样才能做出“this.local.get()”承诺,获取令牌,所以,声明 Observable http.post() 并返回它? (到外部函数)

我只是找不到办法。有什么建议么?谢谢:DD

【问题讨论】:

    标签: angular


    【解决方案1】:

    关键在于您对 Promise 对象的 then() 方法的调用。与done()(返回undefined)不同,then 返回另一个promise,其值解析为作为参数传递给then 的函数返回的值。您可以利用这一点两次:一次将您的令牌传递给 http.post() 调用,另一次将整个承诺从您的 post() 函数中返回:

    post(url : string, json : any) : Observable <\Response> {
    
        var headers = new Headers();
        return this.local.get("token").then( (tk) => {
            headers.append('Authorization', 'Bearer ' + tk);
            var options = new RequestOptions({headers: headers});
            return tk;
        }).then(tk){
            return this.http.post(url, JSON.stringify( json ), options);
        };
    }
    

    【讨论】:

    • 哇,谢谢快速回答。已经试过了。正如我所说,我期待 Observable 返回。所以,我收到了 Typescript 错误:“错误 TS2322:类型 'Promise' 不可分配给类型 'Observable'”
    • 即使我删除了返回类型,我也会收到类似“Promise' 类型上不存在属性 'map'”这样的错误,因为我正在调用 ->map() 并且 map 是Observable 函数(不是 Promise
    • 最后,我尝试使用 > 投射返回,我得到“既没有类型 'Promise' 也没有类型 'Observable' 可以分配给另一个” =////
    • 这是因为 then() 正在返回一个带有 http.post() 的 Observable 的 Promise。您需要返回 promise 解析为的值。要么,要么你必须弄清楚如何(非平凡地)将你的 Promise 转换为 Observable。
    猜你喜欢
    • 2017-06-17
    • 2018-03-05
    • 2016-10-16
    • 2019-05-31
    • 2018-04-17
    相关资源
    最近更新 更多