从angular4(Ionic 3)中的promise返回一个值

时间:2017-08-11 17:18:01

标签: angular ionic-framework angular-promise ionic3

在Ionic 3(angular4)中进行开发时,我遇到了一个问题。我只是在Ionic重做一个以前写过的角度应用程序,但问题开始了,因为我决定使用Ionic"存储"而不是" localStorage"。

问题是由微小的差异造成的,在本地存储中," get" methd只返回一个值,但是Ionic的存储" get" method返回一个promise。

现在,我需要一个从存储中读取特定值并返回它的函数,由于某些原因,我无法容纳我想要使用此值的承诺。

有没有办法在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);
                }
            });
}

1 个答案:

答案 0 :(得分: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));