跳到主要內容

在多個效益之間開始競賽

有時會並行啟動多個任務,但並不需要等待所有任務,只需要取得「獲勝者」,也就是第一個解決(或拒絕)的任務。 race 效益提供一種方式,用於觸發多個效益之間的競賽。

下列範例顯示觸發遠端取得請求的任務,並在 1 秒內限制回應超時。

import { race, call, put, delay } from 'redux-saga/effects'

function* fetchPostsWithTimeout() {
const {posts, timeout} = yield race({
posts: call(fetchApi, '/posts'),
timeout: delay(1000)
})

if (posts)
yield put({type: 'POSTS_RECEIVED', posts})
else
yield put({type: 'TIMEOUT_ERROR'})
}

race 的另一個實用功能是,它會自動取消輸掉的效益。 假設我們有 2 個 UI 按鈕為例

  • 第一個按鈕在背景中啟動一個任務,在無限迴圈 while (true) 中執行(例如每隔 x 秒與伺服器同步一些資料)。

  • 背景任務啟動後,我們啟用第二個按鈕來取消任務

import { race, take, call } from 'redux-saga/effects'

function* backgroundTask() {
while (true) { ... }
}

function* watchStartBackgroundTask() {
while (true) {
yield take('START_BACKGROUND_TASK')
yield race({
task: call(backgroundTask),
cancel: take('CANCEL_TASK')
})
}
}

當一個CANCEL_TASK動作分派時,race Effect將自動通過抛出一個取消錯誤在其內部來取消backgroundTask