Обеспечение обещания не удается - PullRequest
1 голос
/ 04 июня 2019

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

Имея это:

  const ep = `${environment.api.baseUrl}/login`;
  return this.http.post<ILoginResponse>(ep, request).pipe(map(req => {
    this.storage.set(environment.storage_keys.token, req.access_token).then(() => {
      this.authState$.next(true);
    });
    return req;
  })).toPromise();

Как я могуубедиться, что toPromise() будет отклонено, если this.storage.set вернет исключение или не получится по какой-либо причине?

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Карта в этом случае не имеет смысла, потому что вы ничего не отображаете.Вы можете просто сделать это:

const ep = `${environment.api.baseUrl}/login`;
return this.http.post<ILoginResponse>(ep, request)
    .toPromise()
    .then(
        req => {
            this.storage.set(environment.storage_keys.token, req.access_token).then(
                () => this.authState$.next(true)
            );
            return req;
        }
    )

Это решит, если this.storage не удастся.Пример:

const promiseError = new Promise(
    (resolve, reject) => reject('err')
)

const promiseOk = new Promise(
    (resolve, reject) => resolve('ok')
)

promiseOk
    .then(
        req => {
            promiseError
                .then(
                    () => console.log('fa')
                )
                .catch(
                    err => console.log('err')
                )
            return req;
        }
    )
    .then(
        req => console.log(req)
    )
1 голос
/ 04 июня 2019

Вы всегда можете использовать конструктор Promise вместо toPromise, чтобы создать свой собственный для более детального управления:

const ep = `${environment.api.baseUrl}/login`;
return new Promise((resolve, reject) => {
  this.http.post<ILoginResponse>(ep, request).pipe(map(req => {
    this.storage.set(environment.storage_keys.token, req.access_token).then(() => {
      this.authState$.next(true);
      resolve(/* optionally return data here */);
    }).catch(e => reject(e));
  })).catch(e => reject(e)); // Assuming this.http.post returns a promise
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...