【问题标题】:Promise don't resolve in catchError typescript承诺不会在 catchError 打字稿中解决
【发布时间】:2019-10-15 05:13:32
【问题描述】:

我在 catchError 中需要 resolve(false),但这不起作用。

在我的 loin.page.ts

async login() {
      if (this.signin.valid) {
        const controls = this.signin.controls;
        const valid = await this.authService.signin(controls.email.value, controls.password.value);
        if (valid) {
            this.navCtrl.navigateRoot('/user', { animated: true});
        } else {
            console.log('Bad credentials');
        }
    }
  }

authService.ts

import { HttpClient, HttpHeaders } from '@angular/common/http';
import { map, catchError } from 'rxjs/operators';

constructor(private http: HttpClient) {}

signin(email, password) {

        const headers = new HttpHeaders({
            Accept: 'application/json',
            'Content-Type': 'application/json',
            'Access-Control-Allow-Origin': '*',
        });
        const data = {
            email,
            password
        };
        const url = URL_SERVICIOS + 'xxx';
        return new Promise ((resolve) => {

            this.http.post(url, data).pipe(
                map( (result: any) => {
                    this.credentials = result;
                    resolve(true);
                }),
                catchError(() => {
                    return Promise.resolve(false);
                })
            ).subscribe();
        });
     }

此代码以 'return Promise.resolve(false);' 结尾,并且不会在 loin.page.ts

中继续

【问题讨论】:

  • 而不是pipe,你不想要then吗?

标签: typescript promise async-await ionic4 resolve


【解决方案1】:

你可以像下面这样尝试,只是用类型注释并在成功和捕获块中都使用了 resolve()

...
 return new Promise<boolean>((resolve) => {
     this.http.post(url, data).pipe(
         map( (result: any) => {
             this.credentials = result;
             resolve(true);
         }),
         catchError(() => {
             resolve(false);
         })
         ).subscribe();
     });
...

【讨论】:

  • 我收到此错误 '() => void' 类型的参数不可分配给'(err: any,caught: Observable) => ObservableInput' 类型的参数。
【解决方案2】:

那是因为你正在返回一个新的 Promise,它将解析而不是调用解析回调。

尝试做:

        catchError(() => {
             resolve(false);
         })

【讨论】:

  • 我得到'() => void' 类型的参数不可分配给'(err: any,caught: Observable) => ObservableInput' 类型的参数。类型 'void' 不可分配给类型 'ObservableInput'
  • 你能发布返回承诺的整个函数吗?
  • 啊好吧。这是因为您传递给 catchError 的函数的签名是错误的:试试这个:catchError((error) => {resolve(false); return error});
  • 在控制台中出现错误类型错误:您在预期流的位置提供了无效对象。您可以提供 Observable、Promise、Array 或 Iterable。
猜你喜欢
  • 1970-01-01
  • 2017-06-02
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
  • 2020-01-30
相关资源
最近更新 更多