订阅可观察的返回未定义

时间:2019-10-16 12:12:01

标签: angular angular8

我有一项用于更新产品的服务,但是对该产品的订阅返回未定义。保证工作正常 这是我的代码 服务

        updateProduct (id,product): Observable<any> {
        return this.http.put(this.product_url + 'products/' + id, product, {observe : 'response'})
        .pipe(

          catchError(this.handleError<any>('updateProduct'))
        );
      }
 private handleError<T> (operation = 'operation', result?: T) {
    return (error: any): Observable<T> => {

      this.toastr.error(error); // log to console instead

      this.toastr.error(`${operation} failed: ${error.message}`);

      return of(result as T);
    };
  }

组件

this.productService.updateProduct(this.myid,product).subscribe(data =>{
  console.log(data)
  this.response = data
  console.log(this.response)
})

4 个答案:

答案 0 :(得分:0)

如果handleError方法返回未定义并且没有引发错误,如果原始响应中存在错误,则可以继续执行管道,然后将调用lambda并使用未定义的数据。

https://rxjs-dev.firebaseapp.com/api/operators/catchError

在Angular文档的示例中,请注意handleError函数如何返回一个新的observable(catchError运算符将继续执行您返回的任何内容):

Table2(recid, view, userid)

https://angular.io/tutorial/toh-pt6#final-code-review

答案 1 :(得分:0)

您可以尝试删除catchError运算符和管道,看看是否有任何返回。另外,handleError有什么作用?

<header><div>
  <h1>HTML Ipsum Presents</h1>

  <p><strong>Pellentesque habitant morbi tristique</strong> senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. <em>Aenean ultricies mi vitae est.</em>    Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, <code>commodo vitae</code>, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci,
    sagittis tempus lacus enim ac dui. <a href="#">Donec non enim</a> in turpis pulvinar facilisis. Ut felis.</p>
  </div>
</header>
 

答案 2 :(得分:0)

发生问题的原因是处理程序方法捕获了错误。因此最好使用拦截器进行全局错误处理

答案 3 :(得分:-3)

我会这样:

  updateProduct (id,product): Observable<any> {
    return this.http.put(this.product_url + 'products/' + id, product);
  }

并在拦截器中全局处理一些错误。并让任何形式的错误(如错误的request(400)localy)出现。

onSubmit(){
   myservice.updateProduct(...).subscribe(response=>{
    //success
   },error=>{
     //show form errors
   });
}