获得作为承诺的行动响应(如 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,而是将 yieldeffects 结合使用。

您的代码可能如下所示:

// 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。我也在此处使用常见的 REQUESTEDSUCCEEDEDFAILED 模式。

希望这个回答对您有所帮助。