# @adobe/redux-saga-promise 中文文档

规范地址：https://npmcn.com/package/%40adobe/redux-saga-promise/

版本：1\.1\.1
npm 元数据更新时间：2026-10-01T01:34:21.164Z
中文译文更新时间：2026-11-06T08:32:33.992Z
软件包许可：Apache-2\.0

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40adobe/redux-saga-promise
原文对照：https://npmcn.com/package/%40adobe/redux-saga-promise/?lang=original
项目主页：https://github.com/adobe/redux-saga-promise#readme
源码仓库：https://github.com/adobe/redux-saga-promise

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：53.7 kB，11 个文件
- 模块格式：CommonJS
- TypeScript 类型：未声明
- 运行依赖：4 个
- 首次发布：2019-12-19T00:49:05.580Z
- 最新版本发布：2020-05-09T14:07:31.295Z
- 近 30 天下载量：3817（2026-10-05 至 2026-11-03，npm 官方下载统计）
- 已发布版本数：3（近 12 个月 0 个）

## 中文简介

创建返回承诺的动作, 由 redux saga 解决/ 拒绝

## 安装

```sh
npm install @adobe/redux-saga-promise
```

也可以使用：`pnpm add @adobe/redux-saga-promise`、`yarn add @adobe/redux-saga-promise`、`bun add @adobe/redux-saga-promise`

## README

# @adobe/redux-saga-保证

用于定义返回承诺的动作的简单清洁工具 [红相](https://redux-saga.js.org/)

# 概览

图书馆提供:

-   一个动作创造者, `createPromiseAction()` 用于定义返回承诺的动作。 我们要求行动 回报一个承诺 _承诺行动_。 。 。 .
    
-   萨加帮手 `implementPromiseAction()`, (中文(简体) ), `resolvePromiseAction()`,以及`rejectPromiseAction()` 以便你们决心或拒绝约言.
    
-   生命周期行动 `promise.trigger`, (中文(简体) ), `promise.resolved`,以及 `promise.rejected` 可以用于还原器(或任何地方)
    
-   中间的软件,它的工作.
    
-   为了方便,可选的 saga “效果创造者” `dispatch()` 简化发送承诺行动和普通行动 从sagas内部.
    

下文将详细介绍这些情况.

# 安装

同往常一样,通过:

```
npm install @adobe/redux-saga-promise
```

# 使用量

## 包括中间软件:

您必须包含 `promiseMiddleware` 在中间的软件链, 它必须来 _在此之前_ `sagaMiddleware`数字 :

```js
import { applyMiddleware, createStore } from 'redux'
import { promiseMiddleware }            from '@adobe/redux-saga-promise'
import createSagaMiddleware             from 'redux-saga'

// ...assuming rootReducer and rootSaga are defined
const sagaMiddleware = createSagaMiddleware()
const store          = createStore(rootReducer, {}, applyMiddleware(promiseMiddleware, sagaMiddleware))
sagaMiddleware.run(rootSaga)
```

## 创建承诺行动:

使用 `createPromiseAction`,类似于 [`createAction`](https://redux-actions.js.org/api/createaction#createaction) 联 合 国 [重排动作](https://redux-actions.js.org/)数字 :

```js
import { createPromiseAction } from '@adobe/redux-saga-promise'

export const myAction = createPromiseAction('MY_ACTION')
```

在幕后现场, `createPromiseAction` 用途 `createAction` 定义 [自由军](https://github.com/acdlite/flux-standard-action)\- 符合要求的行动. 它也接受 `payload` 财务报告和审定财务报表 `meta` 作为可选第二和第三 参数,与 `createAction`. (和,喜欢 `createAction`技术 `createPromiseAction` 返回动作 _创建者_ 而不是行动。 )

## 发出承诺行动:

通常发出承诺行动 `dispatch()` 誓以报应

```js
import myAction from './myAction'

// In an ordinary function...
function () {
  ...
  dispatch(myAction(payload)).then(value => ...).catch(error => ...)
  ...
}

// In an async function....
async function () {
  try {
    const value = await dispatch(myAction(payload))
    ...
  } catch (error) {
    ...
  }
}
```

## 在 saga 中解决/ 拒绝动作 :

由你作为执行者 解决或拒绝承诺的行动 在萨加。 需要帮助的人有三个:

### `implementPromiseAction(action, saga)`

最方便的办法! 您给这个助手一个 saga 函数 将执行。 如果 saga 函数顺利返回一个值, 承诺会 以这个价值解决问题。 如果 saga 函数抛出错误, 承诺 将因这个错误而被拒绝。 例如:

```js
import { call, takeEvery }        from 'redux-saga/effects'
import { promises as fsPromises } from 'fs'
import { implementPromiseAction } from '@adobe/redux-saga-promise'

import myAction from './myAction'

//
// Asynchronously read a file, resolving the promise with the file's
// contents, or rejecting the promise if the file can't be read.
//
function * handleMyAction (action) {
  yield call(implementPromiseAction, action, function * () {
    // 
    // Implemented as a simple wrapper around fsPromises.readFile.
    // Rejection happens implicilty if fsPromises.readFile fails.
    //
    const { path } = action.payload
    return yield call(fsPromises.readFile, path, { encoding: 'utf8' })
  })
}

export function * rootSaga () {
  yield takeEvery(myAction, handleMyAction)
})
```

如果你打电话 `implementPromiseAction()` 第一个论点不是 承诺行动,它就会出错(参看 [参数验证](https://npmcn.com/package/%40adobe/redux-saga-promise/#readme-argument-validation) 页:1.

### `resolvePromiseAction(action, value)`

有时你可能想要更好的控制, 或想更加明确 当你知道一个 手术不会失败的 这个帮手让大家承诺要解决 超过值。 例如:

```js
import { call, delay, takeEvery } from 'redux-saga/effects'
import { resolvePromiseAction }   from '@adobe/redux-saga-promise'

import myAction from './myAction'

//
// Delay a given number of seconds then resolve with the given value.
//
function * handleMyAction (action) {
  const { seconds, value } = action.payload
  yield delay(seconds*1000)
  yield call(resolvePromiseAction, action, value)
}

function * rootSaga () {
  yield takeEvery(myAction, handleMyAction)
})
```

如果你打电话 `resolvePromiseAction()` 第一个论点不是 承诺行动,它就会出错(参看 [参数验证](https://npmcn.com/package/%40adobe/redux-saga-promise/#readme-argument-validation) 页:1.

### `rejectPromiseAction(action, value)`

有时你可能想要更精细的控制, 或希望明确失败而不需要 `throw`。这个帮助者导致承诺拒绝 ,通常应为 `Error`。例如:

```js
import { call, takeEvery }     from 'redux-saga/effects'
import { rejectPromiseAction } from '@adobe/redux-saga-promise'

import myAction from './myAction'

//
// TODO: Implement this!   Failing for now
//
function * handleMyAction (action) {
  yield call(rejectPromiseAction, action, new Error("Sorry, myAction is not implemented yet")
}

function * rootSaga () {
  yield takeEvery(myAction, handleMyAction)
})
```

如果你打电话 `rejectPromiseAction()` 第一个论点不是 承诺行动,它就会出错(参看 [参数验证](https://npmcn.com/package/%40adobe/redux-saga-promise/#readme-ArgumentValidation) 页:1.

## 行动生命周期 -- -- 减少承诺行动:

您通常希望redux 商店反映承诺动作的状态 : 是否待决, 已解析的值是多少, 还是被拒绝的错误 没错.

在幕后现场, `myAction = createPromiseAction('MY_ACTION')` 其实 创建一个包含三个动作的组合:

-   `myAction.trigger`: 用于 `myAction`即你们所派遣的使者,而你们却加以警告.
    
-   `myAction.resolved`自动发送 `promiseMiddleware` 当承诺实现时,其有效载荷就是承诺的确定价值
    
-   `myAction.rejected`自动发送 `promiseMiddleware` 当约言被否认的时候,其有效载荷是否认约言的
    

你可以轻松地用在 `handleActions` 联 合 国 [重排动作](https://redux-actions.js.org/)数字 :

```js
import { handleActions } from 'redux-actions'

import myAction from './myAction'

//
// For the readFile wrapper described above, we can keep track of the file in the store
//
export const reducer = handleActions({
    [myAction.trigger]:  (state, { payload: { path } }) => ({ ...state, file: { path, status: 'reading'} }),
    [myAction.resolved]: (state, { payload: contents }) => ({ ...state, file: { path: state.file.path, status: 'read', contents } }),
    [myAction.rejected]: (state, { payload: error })    => ({ ...state, file: { path: state.file.path, status: 'failed', error } }),
  }, {})
```

## 发出承诺行动

在履行你商业逻辑的萨加斯,你有时可能想要发出承诺行动并等待它解决. 你可以用Redux相机 [`putResolve`](http://redux-saga.js.org/docs/api/#putresolveaction) 效果 :

`const result = yield putResolve(myPromiseAction)`

此举发出行动并等待承诺解决,还原已解决的价值. 或者,如果承诺拒绝 它会冒出一个错误.

_小心点!_ 如果您使用 [`put()`](http://redux-saga.js.org/docs/api/#putaction%60) 改为 `putResolve()`{\\fn黑体\\fs22\\bord1\\shad0\\3ahbe\\4ah00\\fscx67\\fscy66\\2chffffff\\3ch808080}萨加会立即继续处决 {\\fn黑体\\fs22\\bord1\\shad0\\3ahbe\\4ah00\\fscx67\\fscy66\\2chffffff\\3ch808080}而不会等待承诺的解决 {\\fn黑体\\fs22\\bord1\\shad0\\3ahbe\\4ah00\\fscx67\\fscy66\\2chffffff\\3ch808080}我发誓.

### 发送 sagas 动作的助手

_TL; 医生: `dispatch()` 帮助是完全可选的。 你可以忽略这一节。 但对于发出承诺行动的信条, 你可以使用它 如果你认为它会 让你的代码清洁或更坚固._

在运行您的商业逻辑的sagas中,如果您发送了普通动作和许诺动作的组合,您必须记住使用 `put()` 对 `putResolve()` 适当的。 例如,你可能已经:

```js
import { call, put, putResolve } from 'redux-saga/effects'

function * myBusinessLogic () {
  yield putResolve(myPromiseAction({ c:3, d: 4 })) // Wait for promise to resolve
  yield put(someOrdinaryAction({ a: 1, b: 2}))     // Don't wait
  yield call(someAsyncFunction, { e: 5 })          // Waits for promise to resolve
  yield call(someOrdinaryFunction, { f: 6 })       // Doesn't wait
}
```

不幸的是,它很容易不小心使用 `put()` 改为 `putResolve()` 这意味着萨加会立即继续 而不等待你的承诺 解决 - 在许多 造成微妙错误的案例。 (在这里的体验! )

为了避免这个错误,为了保持一致, `redux-saga-promise` 提供“ 效果创建者” 名称 `dispatch`。通过:

-   `yield dispatch(action)`,通过动作
-   `yield dispatch(actionCreator, ...args)`,通过动作创建器和可选参数 `dispatch()` 将产生一种行动.

行为模仿 [`call()`](https://redux-saga.js.org/docs/api/#callfn-args) - 说吧 如果行动是一种承诺行动, `yield dispatch()` {\\fn黑体\\fs22\\bord1\\shad0\\3ahbe\\4ah00\\fscx67\\fscy66\\2chffffff\\3ch808080}会派它去阻止它 {\\fn黑体\\fs22\\bord1\\shad0\\3ahbe\\4ah00\\fscx67\\fscy66\\2chffffff\\3ch808080}直到.. 承诺解析后返回解析值( 或如果 约言是否认的。 对于任何其他行动, `yield dispatch()` 将简单的 正常发送,随心所欲 `store.dispatch` 返回.

这让你使用 `yield dispatch(action, ...args)` 随地发送 动作,比如你可以使用 `yield call(function, ...args)` 以调用函数。 那你就不用担心哪些行动是承诺行动,哪些不是承诺行动. 即:

```js
import { call }     from 'redux-saga/effects'
import { dispatch } from '@adobe/redux-saga-promise'

function * myBusinessLogic () {
  yield dispatch(myPromiseAction, { c:3, d: 4 })    // Waits for promise to resolve
  yield dispatch(someOrdinaryAction, { a: 1, b: 2}) // Doesn't wait
  yield call(someAsyncFunction, { e: 5 })           // Waits for promise to resolve
  yield call(someOrdinaryFunction, { f: 6 })        // Doesn't wait
}
```

在幕后现场, `dispatch()` 简单的返回 `put(action)` 或者说 `putResolve(action)` 基于此动作是否由 `createPromiseAction`。 。 。 .

如果你打电话 `dispatch()` 第一个论点是: `null`,或者第一个参数不是一个函数,但您提供额外 `...args` 无论如何,它会扔 错误(参见 [参数验证](https://npmcn.com/package/%40adobe/redux-saga-promise/#readme-argument-validation) (见下文)

## 参数验证

为了避免意外混淆,所有帮助函数都会验证其 参数并显示自定义 `Error` 子类 `ArgumentError` 情况 错误。 这个错误会像往常一样被redux-saga所泡出,而你也可以像往常一样在saga中接住它,否则它会泡出到 [`onError`](https://redux-saga.js.org/docs/api/#createsagamiddlewareoptions) 钩. 如果想要,可以测试错误类型,例如:

```js
import { applyMiddleware, compose, createStore } from 'redux'
import { ArgumentError, promiseMiddleware }      from '@adobe/redux-saga-promise'
import createSagaMiddleware                      from 'redux-saga'

// ...assuming rootReducer and rootSaga are defined
const sagaMiddleware = createSagaMiddleware({ onError: (error) => {
  if (error instanceof ArgumentError) {
    console.log('Oops, programmer error! I called redux-saga-promise incorrectly:', error)
  } else {
    // ...
  }
})
const store = createStore(rootReducer, {}, compose(applyMiddleware(promiseMiddleware, sagaMiddleware)))
sagaMiddleware.run(rootSaga)
```

此外,所有的助手函数都会丢出自定义 `Error` 子类 `ConfigurationError` 若为 `promiseMiddleware` 但没有适当列入该商店.

# 捐款

欢迎捐款! 读取 [贡献指南](https://npmcn.com/package/%40adobe/redux-saga-promise/CONTRIBUTING.md) 更多信息.

### 构建测试( T)

`package.json` 定义常用脚本 :

-   `npm build`:转出源头,将结果放入 `dist/index.js`
-   `npm test`:构建,然后运行测试套件.

测试是用 [阿富汗](https://github.com/avajs/ava) 试跑者.

# 许可证发放

这个项目根据Apache V2许可证获得许可. 见 [自由主义](https://npmcn.com/package/%40adobe/redux-saga-promise/LICENSE) 更多信息.

## 常见问题

### @adobe/redux-saga-promise 是什么？

创建返回承诺的动作, 由 redux saga 解决/ 拒绝

### 如何安装 @adobe/redux-saga-promise？

在项目目录运行 npm install @adobe/redux-saga-promise，或使用 pnpm add / yarn add / bun add。

### @adobe/redux-saga-promise 支持 TypeScript 吗？

该包的 package\.json 没有声明类型入口。需要类型提示时，可以在 npm 上查找社区维护的 @types/adobe\_\_redux-saga-promise 是否存在。

### @adobe/redux-saga-promise 支持 ESM 还是 CommonJS？

以 CommonJS 形式发布，可以直接 require\(\)；在 ES Module 项目中也可以用 import 引入（Node\.js 会把 module\.exports 作为默认导出）。

### @adobe/redux-saga-promise 可以商用吗？

@adobe/redux-saga-promise 使用 Apache-2\.0 许可。宽松许可：允许商业使用、修改和再分发，并附带明确的专利授权；分发时需保留许可与 NOTICE 文件，修改过的文件要注明改动。以上为概括，不构成法律意见，请以许可原文为准。

### @adobe/redux-saga-promise 的下载量有多少？

根据 npm 官方下载统计，@adobe/redux-saga-promise 在 2026/10/05 – 2026/11/03 这 30 天内被下载 3,817 次，日均约 127 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @adobe/redux-saga-promise 还在维护吗？

最新版本 1\.1\.1 发布于 2020/05/09（6 年前）；至今共发布 3 个版本，其中过去 12 个月发布了 0 个；首次发布于 2019/12/19。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

