這更像是問題而不是解決問題。
我想知道是否有沒有觸發“成功”和“錯誤”的情況。
對后呼叫"/logout"將導致 Http 狀態回傳代碼 200,回應主體為空,這是預期的
import { httpClient } from angular/common/http;
private http: HttpClient;
this.http.post<any>('/logout', {})
.subscribe(() => {
console.log("Logout");
}, error => {
console.log(error);
},
() => {
console.log("Finally);
});
它不會觸發“成功”呼叫(因為沒有資料回來)?,并且不會觸發錯誤。
uj5u.com熱心網友回復:
Observable,一般情況下,都不需要完成或出錯。它們可能永遠活著,并繼續發出值。
然而,Observable回傳的由HttpClient 被根據回應的HTTP狀態保證與成功或錯誤終止(盡管該錯誤可能在超時的情況下,需要幾分鐘的時間)。沒有身體的存在不會影響這一點。
當然,Observable只有在身體存在時才會發出一個值。
這似乎是這里的問題,因為您似乎混淆了回呼。當您提供三個回呼來訂閱時,它們按順序是:
- 的
next回呼,其接收發射的值 - 的
error回呼,其通知的Observable已中止由于一個錯誤 - 的
complete回呼,其通知的Observable已成功完成
因此沒有next被呼叫也就不足為奇了,因為Observable選擇不發出任何值。如果您想知道注銷是否成功完成,您應該監聽complete而不是next。
混淆回呼的危險是 RXJS 團隊不贊成將多個回呼作為單獨的引數傳遞給 RXJS 8 訂閱的原因之一。撰寫代碼的未來證明方法是:
this.http.post<any>('/logout', {}).subscribe({
complete: () => {
console.log("Logout successful")
},
error: (error) => {
console.log(error);
}
});
順便說一句,finallyRXJS 中沒有回呼。如果你想做一些事情而不管是Observable成功完成還是失敗了錯誤,你可以使用finalize運算子。
uj5u.com熱心網友回復:
httpClient 請求與 http 狀態碼相關。
如果您提出請求,您將收到任何形式的回復。
本檔案與http回應狀態碼相關。嘗試閱讀頁面。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
uj5u.com熱心網友回復:
代碼如下:
this.http
.get('/logout')
.pipe(
map(() => { // OK
return { success: true, err: null };
}),
timeout(10000), // CONTROL TIMEOUT
catchError((e) => { // IN CASE OF ERROR
return of({success: false, err:e});
})
)
.subscribe((result) => { // FINALLY here
if (result.success) {
console.log('Logged out successfully');
} else {
console.log('Logout failed', result.err);
}
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/352698.html
