2016-11-14 83 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