【问题标题】:Return a value from a promise in angular4 (Ionic 3)从 angular4 (Ionic 3) 中的 promise 返回一个值
【发布时间】:2017-08-12 01:40:48
【问题描述】:

我在 Ionic 3 (angular4) 中开发时遇到了一个问题。我只是在 Ionic 中重做一个以前编写的 Angular 应用程序,但是自从我决定使用 Ionic “存储”而不是“localStorage”以来,问题就开始了。

问题是由微小的差异引起的,在本地存储中,“get”方法只返回一个值,但 Ionic 的存储“get”方法返回一个承诺。

现在,我需要一个从存储中读取特定值并将其返回的函数,但由于某些原因,我无法在要使用该值的地方提供承诺。

有没有办法在 get 方法上获得与 localStorage 类似的行为?

getAccessToken()
  {
    return this._storage.get('bdAccessToken');
  }

getAuthorizationOptions(){
                let token = this._authService.getAccessToken();
                let header = new Headers({
                    'Authorization': 'Bearer '+ token
                });
                let ro = new RequestOptions({
                    headers: header
                });
                let options = new RequestOptions();
                if (options.headers) options.headers.delete("Authorization");
                options.headers = header;
                return options;
}



get(url:string, options?:RequestOptions):Observable<Response>
    {    

        return super.get(url, this.getAuthorizedOptions())
            .catch(err => {
                console.log("shit 1");
                console.log(err);
                if (err && err.status === 401){
                    console.log("401 here...");
                    return this._authService.refreshToken()
                        .flatMap(r =>
                            super.get(url, this.getAuthorizedOptions())
                        )
                        .catch(err2 => {
                            this.redirect();
                            return Observable.throw(err2);
                        });
                }
                else {
                    return Observable.throw(err);
                }
            });
}

【问题讨论】:

    标签: angular ionic-framework angular-promise ionic3


    【解决方案1】:

    您不能像使用同步一样使用异步接口。这是根本。您必须使用该接口重写部分代码才能异步操作。

    如果您有权访问async/await,那么最简单的方法就是

    // OLD
    function getStuff() {
      const stuff = get('stuff');
      return stuff + 1;
    }
    
    // NEW
    async function getStuff() {
      const stuff = await getAsync('stuff');
      return stuff + 1;
    }
    

    当然,getStuff 现在是异步的,因此使用它的代码可能也需要更改。

    由于某些原因,我无法在我想使用此值的地方提供承诺。

    我无法想象这些原因会是什么。任何形式的代码

    const value = getValue();
    doSomethingWithValue(value);
    

    总是可以改写为

    const valueP = getPromiseForValue();
    valueP.then(value => doSomethingWithValue(value));
    

    【讨论】:

    • 谢谢,我已更新我的问题以包含我的一段代码。您能否详细说明如何根据您的建议修改这一系列相互依赖的方法?
    • 嘿@torazaburo,你能帮忙吗?我在这里提出了不同的问题:stackoverflow.com/questions/45655939/…
    猜你喜欢
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    相关资源
    最近更新 更多