【问题标题】:Subscribe to observable when Web API returns void当 Web API 返回 void 时订阅 observable
【发布时间】:2017-03-28 13:47:38
【问题描述】:

我有一个返回 void 的 web api 删除方法

在 Angular 2 中,如果我不订阅 Observable,web api 方法将永远不会被调用。 QuestionCold vs Hot observables。由于需要返回一个 observable 并订阅,我试图返回一个 Observable 为:

服务.ts

public deleteProduct = (product: ProductApi): Observable<boolean> | boolean => {
   this._http.delete(this.actionUrl + product.productId)
   .catch((error:boolean) => Observable.throw(false));
   return true;
}

组件.ts

deleteProduct(product: ProductApi, event: any): void {
   event.stopPropagation();
   this.productApiService
   .deleteProduct(product)
   .subscribe((boolean) => {
   this.products = this.products.filter(p => p !== product);
   if (this.selectedProduct === product) { this.selectedProduct = null; }},
      error => console.log(error),
      () => {
      console.log('ProductApiService:Delete completed');
    });
 }

controller.cs

// DELETE api/product/5
[HttpDelete("{id}")]
public void Delete(int id)
{
    _productService.DeleteProduct(id);
}

或者有办法返回 Observable?或者如果上述方法是正确的,我该如何解决以下错误?

  • 构建:参数“布尔”隐含具有“任意”类型
  • 构建:参数“错误”隐含具有“任何”类型
  • 构建:“boolean |”类型上不存在属性“subscribe”可观察的'

【问题讨论】:

    标签: angular asp.net-core asp.net-web-api2


    【解决方案1】:

    为什么需要 catch inside 删除请求? 您可以在订阅时将错误逻辑添加到错误函数中。

    public deleteProduct(product: ProductApi): Observable<any> {
       return this._http.delete(this.actionUrl + product.productId);
    }
    

    然后

    deleteProduct(product: ProductApi, event: any): void {
       event.stopPropagation();
       this.productApiService
       .deleteProduct(product)
       .subscribe(
         response => {
           this.products = this.products.filter(p => p !== product);
           if (this.selectedProduct === product){
             this.selectedProduct = null; 
           }},
          error => console.log(error),
          () => {
          console.log('ProductApiService:Delete completed');
        });
    }
    

    如果在此更改后您的控制器仍未调用,我认为这是路由错误。

    【讨论】:

    • 感谢您的回答,我不太明白您为什么将地图功能用作:.map(response => response.json());因为 WebAPI 不返回任何值只是 void?
    • 这里解释了哪个响应 web api 转换了 void 返回类型:asp.net/web-api/overview/getting-started-with-aspnet-web-api/…。根据此来源,响应将如下所示:HTTP/1.1 204 No Content Server: Microsoft-IIS/8.0 Date: Mon, 27 Jan 2014 02:13:26 GMT
    • 是的,您的代码没有使用任何响应数据,因此您可以删除这行代码。此响应可能有助于检查响应状态代码并为不同的状态代码实现不同的逻辑。
    • 感谢您的帮助,我找到了 map(response => response.json());生成 json 解析错误语法错误意外结束输入。根据以下问题注释掉地图解决问题stackoverflow.com/questions/35734411/…
    • 我将标记答案,因为您阐明了映射问题。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 2017-02-17
    • 2018-09-01
    • 2019-03-09
    • 1970-01-01
    相关资源
    最近更新 更多