【问题标题】:Fetching value via promise Angular in custom service在自定义服务中通过 Promise Angular 获取价值
【发布时间】:2017-10-11 14:39:30
【问题描述】:

我有这个代码:

import { Injectable } from '@angular/core';
import { Http, Headers } from '@angular/http';
import { Storage } from '@ionic/storage';
import { AppSettings } from './shared';

@Injectable()
export class HttpClient {

    constructor(private http: Http, private storage: Storage) { }

    createAuthorizationHeader(headers: Headers) {
        var token: string = '';
        this.storage.get(AppSettings.StorageKeys.Token).then(value => {
            token = value;
        });
        headers.append('Authorization', 'Bearer ' + token);
    }

    get(url) {
        let headers = new Headers();
        this.createAuthorizationHeader(headers);
        return this.http.get(url, {
            headers: headers
        });
    }

    post(url, data) {
        let headers = new Headers();
        this.createAuthorizationHeader(headers);
        return this.http.post(url, data, {
            headers: headers
        });
    }
}

这里的问题是:

this.storage.get(AppSettings.StorageKeys.Token).then(value => {
            token = value;
        });

这是承诺。那么如何更改createAuthorizationHeader 函数,以便正确附加标头?

这是 Ionic2 代码,但大多数问题与承诺的工作有关。

【问题讨论】:

    标签: javascript angular promise angular2-services


    【解决方案1】:

    返回一个标头承诺,然后链接来自该承诺的 http 调用。此外,get 方法应该返回 Promise,尽管 Observable,同样你可以使用 .toPromise() 而不是 http.get 方法。

    createAuthorizationHeader() {
        return this.storage.get(AppSettings.StorageKeys.Token).then(value => {
            let headers = new Headers();
            var token: string = '';
            token = value;
            headers.append('Authorization', 'Bearer ' + token);
            return headers;
        });
    }
    
    get(url) {
        //let headers = new Headers();
        return this.createAuthorizationHeader().then(headers => {
            return this.http.get(url, { headers: headers }).toPromise();
        });
    }
    

    post 函数执行相同操作。


    我会失去 Observable 并且必须使用 Promise。

    如果您希望使用可观察对象,请在链接两个 Promise 后转换 Promise:

    get(url) {
        //let headers = new Headers();
        var promise = this.createAuthorizationHeader().then(headers => {
            return this.http.get(url, { headers: headers }).toPromise();
        });
        return Observable.fromPromise(promise);
    }
    

    【讨论】:

    • 谢谢!如此有效地,我会失去 Observable 并且必须使用 Promise。不是吗?
    • @TimLiberty 您可以通过将createAuthorizationHeader 转换为返回 Observable 来轻松地使用 observable。
    • @PankajParkar:你能发帖作为答案吗?
    • @TimLiberty 可以添加this.storage.get 方法代码吗?还是它是一些插件/内置的东西?
    • this.storage.get 返回一个承诺。它是 Ionic 2 中内置的东西。
    【解决方案2】:

    createAuthorizationHeader 没有返回一个 Promise,你应该从 Promise 函数成功创建 Authorization 令牌。同样,您的服务的get 应该返回承诺,同样您可以使用.toPromise() 来返回promise,尽管Observable。但由于您不会丢失可观察到的酱汁,您应该考虑将createAuthorizationHeader 方法转换为返回ObservableObservable.fromPromise 将在这种情况下拯救我们,将Promise 转换为Observable

    代码

    createAuthorizationHeader(headers: Headers) {
        var token: string = '';
        let headers = new Headers();
        return Observable.fromPromise(this.storage.get(AppSettings.StorageKeys.Token)
          .then(value => {
            token = value;
            headers.append('Authorization', 'Bearer ' + token);
            return headers;
          }
        );
    }
    
    get(url) {
        return this.createAuthorizationHeader()
         .switchMap((headers)=> this.http.get(url, {
            headers: headers
          });
        })
    }
    

    【讨论】:

    • @TimLiberty switchMap 将切换对其他 Observable 的控制,在当前情况下,它切换到 http.get 方法并返回该 Observable.. :p 您的欢迎 bhai :) 随时询问您是否需要其他任何东西在回答
    • @TimLiberty 有帮助吗??
    • 太棒了!感谢您消除混乱。标记为答案。
    猜你喜欢
    • 1970-01-01
    • 2020-02-14
    • 2020-10-29
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 2012-10-05
    • 2021-03-02
    相关资源
    最近更新 更多