2016-11-14 21 views
0

我有一个web api删除方法返回void当Web API返回无效时订阅observable

在angular 2中,如果我没有订阅Observable,web api方法将永远不会被调用。 QuestionCold vs Hot observables。由于有必要返回一个可观察和订阅,我试图返回一个观察为:

Service.ts

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

Component.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 <'void'>?或者如果上述方法是正确的,我该如何解决以下错误?

  • 体形:参数“布尔”含蓄有一个“任意”类型
  • 体形:参数“错误”含蓄有一个“任意”类型
  • 编译:房产“订阅”不会对类型存在'布尔|可观察'

回答

0

为什么你需要捕获内部删除请求? 您可以在订阅时将错误逻辑添加到错误功能。

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'); 
    }); 
} 

及后若这改变了你的控制器仍然不叫我认为这是路由错误。

+0

感谢您的回答,我不太明白为什么您使用map函数为:.map(response => response.json());因为WebAPI不返回任何值只是无效的? – Exec21

+0

下面是响应web API转换void返回类型的解释:https://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/action-results。 因此该源的响应将看起来像: HTTP/1.1 204无内容 服务器:Microsoft-IIS/8.0 日期:星期一,2014年1月27日2时13分26秒GMT – Nikolai

+0

是的,你的代码不使用任何响应数据,因此您可以删除该行代码。此响应可能对检查响应状态代码和实现不同状态代码的不同逻辑有用。 – Nikolai