【问题标题】:HTTP post callback in angular component角度组件中的 HTTP 发布回调
【发布时间】:2018-01-08 19:51:22
【问题描述】:

我最近一直在学习 Angular 4,并使用了“英雄之旅”教程here

在 Hero 服务中,addHero 方法是使用 .pipe 函数配置的,复制如下:

/** POST: add a new hero to the server */
addHero (hero: Hero): Observable<Hero> {
    return this.http.post<Hero>(this.heroesUrl, hero, httpOptions).pipe(
        tap((hero: Hero) => this.log(`added hero w/ id=${hero.id}`)),
        catchError(this.handleError<Hero>('addHero'))
    );
}

这一切都很好 - 现在组件可以调用 this.heroService(heroObject)。然而,我遇到的问题是当它出错时会发生什么。是的,管道内的 catchError 处理它,但在我看来,该组件似乎不知道发生了什么。如果有 404 并且从未添加英雄怎么办?在组件中,通过以下方式添加英雄:

add(name: string): void {
    name = name.trim();
    if (!name) { return; }
    this.heroService.addHero({ name } as Hero)
        .subscribe(hero => {
            this.heroes.push(hero);
        });
}

在我看来,如果发生错误,this.heroes.push(hero) 仍然会激活,并且我们会错误地将英雄添加到组件的英雄数组中。我如何配置它,以便在成功发布时完成 this.heroes.push(hero),在这种情况下,抛出错误(4xx、5xx 等),而是显示警报(为简单起见)?

【问题讨论】:

  • 这只是一个演示概念的示例。您需要按照您的意愿处理相应的事件。比如说,如果出现错误,需要通过警报消息或警报样式等方式通知用户。

标签: javascript angular typescript


【解决方案1】:

你可以试试这个:

add(name: string): void {
    name = name.trim();
    if (!name) { return; }
    this.heroService.addHero({ name } as Hero)
        .subscribe(hero => {
            this.heroes.push(hero);
        }, error => {
            alert("Failed to get the hero.");
        });
}

在前面的代码段中,subscribe 方法的第二个参数采用错误事件处理程序。并且只有在请求成功完成(200 Ok)时才会调用第一个参数。因此,没有机会错误地添加英雄。

【讨论】:

  • 此外,subscribe 方法最多可以接收三个参数:next 函数、error 函数和 complete 函数。特别是对于 Http 请求,next 在请求成功时调用,error 在错误时调用,completenext 函数之后调用。另见:ReactiveX docs
  • 感谢您的回复。很高兴看到您所说的与我已经尝试过的类似。至少这意味着我走在正确的道路上。但是,错误仍然没有过滤回来。我认为原因是似乎正在处理错误的第一个代码块不会让错误过滤器退出。正如指南所描述的那样:“下面的 handleError() 方法报告错误,然后返回一个无害的结果,以便应用程序继续工作。”有什么方法可以保留 handleError 的功能,但仍然让它过滤掉?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-02
  • 1970-01-01
相关资源
最近更新 更多