获得作为承诺的行动响应(如 redux-thunk)
Get response of action as a promise (like redux-thunk)
我正在从 redux-thunk 转移到 redux-saga,但发现了一个不足。
使用 redux-thunk 我有一个非常典型的做法 "add requests":
try {
downloadId = await dispatch(requestDownload('SOME_URL'));
} catch(ex) {
console.log('download already existed, so request denied');
}
该行动将 return 一个承诺,我可以等待。 request
函数(上面的 requestDownload
)要么同意请求,并用 downloadId
解析,要么拒绝,如果 SOME_URL
的下载已经存在。
我如何在 redux-saga 中执行此操作?看来动作不能return什么。
谢谢
在 redux-saga
中,您没有使用 await
,而是将 yield
与 effects
结合使用。
您的代码可能如下所示:
// saga.js
import { call, put } from 'redux-saga/effects'
import { requestDownloadSucceeded, requestDownloadFailed } from './reducer.js'
function* downloadRequestedFlow() {
try {
const downloadId = yield call(requestDownload, 'SOME_URL')
yield put(requestDownloadSucceeded(downloadId))
} catch(error) {
yield put(requestDownloadFailed(error))
}
}
// reducer.js
...
export const requestDownloadSucceeded = downloadId => ({
type: REQUEST_DOWNLOAD_SUCCEEDED,
downloadId,
})
export const requestDownloadFailed = error => ({
type: REQUEST_DOWNLOAD_FAILED,
error,
})
请注意带有 *
的生成器函数,它允许使用 yield。我也在此处使用常见的 REQUESTED
、SUCCEEDED
、FAILED
模式。
希望这个回答对您有所帮助。
我正在从 redux-thunk 转移到 redux-saga,但发现了一个不足。
使用 redux-thunk 我有一个非常典型的做法 "add requests":
try {
downloadId = await dispatch(requestDownload('SOME_URL'));
} catch(ex) {
console.log('download already existed, so request denied');
}
该行动将 return 一个承诺,我可以等待。 request
函数(上面的 requestDownload
)要么同意请求,并用 downloadId
解析,要么拒绝,如果 SOME_URL
的下载已经存在。
我如何在 redux-saga 中执行此操作?看来动作不能return什么。
谢谢
在 redux-saga
中,您没有使用 await
,而是将 yield
与 effects
结合使用。
您的代码可能如下所示:
// saga.js
import { call, put } from 'redux-saga/effects'
import { requestDownloadSucceeded, requestDownloadFailed } from './reducer.js'
function* downloadRequestedFlow() {
try {
const downloadId = yield call(requestDownload, 'SOME_URL')
yield put(requestDownloadSucceeded(downloadId))
} catch(error) {
yield put(requestDownloadFailed(error))
}
}
// reducer.js
...
export const requestDownloadSucceeded = downloadId => ({
type: REQUEST_DOWNLOAD_SUCCEEDED,
downloadId,
})
export const requestDownloadFailed = error => ({
type: REQUEST_DOWNLOAD_FAILED,
error,
})
请注意带有 *
的生成器函数,它允许使用 yield。我也在此处使用常见的 REQUESTED
、SUCCEEDED
、FAILED
模式。
希望这个回答对您有所帮助。