我有一個 django 后端,我正在嘗試每 3 秒輪詢多個 Celery 任務( https://docs.celeryq.dev/en/stable/index.html )的狀態。
例如,我有 4 個任務 ID:
- 3099023
- 3493494
- 4309349
- 5498458
所以我必須每 3 秒呼叫一次 http.get<...>(backend) 每個 id 4 次,直到 id 的狀態為“FINISHED”。這應該停止對已完成任務的輪詢。
有沒有一種簡單的方法可以做到這一點?
我試圖在 for 回圈中做到這一點:
- 遍歷我的 id
- 為每個 id 創建一個計時器
- 在每個計時器中,使用后端 http 呼叫輪詢 id
- 如果 http 呼叫的回應未完成則繼續 - 否則停止
uj5u.com熱心網友回復:
我認為我們可以使用 rxjs 做得更好,這是使用 rxjs 運算子來實作您的目標的示例。
注意:這只是一個沒有組件/服務的示例,以使示例中的事情變得簡單。
import { interval, of, mergeMap, from, switchMap, takeWhile } from 'rxjs';
const ids = [3099023, 3493494, 4309349, 5498458];
from(ids).pipe(
mergeMap((id) =>
interval(3000).pipe(
switchMap((val) => mockHttpCallExample(val, id)),
takeWhile((httpResonse) => httpResonse !== 'FINISHED')
))).subscribe(val => console.log(val))
const mockHttpCallExample = (val, id) => {
let httpResponse;
if (id % 2 === 0 && val === 4) {
httpResponse = 'FINISHED'
} else if (id % 2 !== 0 && val === 5) {
httpResponse = 'FINISHED'
} else {
httpResponse = 'OK'
}
console.log(id, val);
return of(httpResponse)
}
我們在這里做什么:
- 使用 from 運算子,我們為每個 id 發出一個值
- 在 mergeMap 中,我們每 3 秒向 API 發出一個 http 請求
- 當我們從模擬 API 呼叫中收到“FINISHED”字串時,該程序將結束
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/531721.html
上一篇:Angular-如何從用戶輸入表單中獲取單選按鈕值?
下一篇:Angular'nativeElement viewchild'vs'document.querySelector'相當混亂
