Вернуть значение из обещания в angular4 (Ionic 3)

Я столкнулся с тупиковой ситуацией при разработке в Ionic 3 (angular4). Я просто переделываю ранее написанное приложение angular на Ionic, но проблема возникла с тех пор, как я решил использовать Ionic «хранилище» вместо «localStorage».

Проблема вызвана крошечной разницей: в локальном хранилище метод «get» просто возвращает значение, а метод «get» хранилища Ionic возвращает обещание.

Теперь мне нужна функция, которая считывает определенное значение из хранилища и возвращает его, и по некоторым причинам я не могу разместить обещание, в котором я хочу использовать это значение.

Есть ли способ добиться аналогичного поведения метода 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);
                }
            });
}

person Behrooz    schedule 11.08.2017    source источник


Ответы (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));
person Community    schedule 11.08.2017
comment
Спасибо, я обновил свой вопрос, чтобы он содержал часть моего кода. Можете ли вы случайно уточнить, как эту цепочку методов, которые зависят друг от друга, можно изменить на основе вашего предложения? - person Behrooz; 11.08.2017
comment
Привет @torazaburo, ты можешь помочь? Я сформулировал свой вопрос иначе: stackoverflow.com/questions/45655939/ - person Behrooz; 13.08.2017