@adobe/redux-saga-promise

中文文档
1.1.1发布于 2020/05/09Apache-2.0CommonJS近 30 天下载 3817

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

中文使用文档
文档目录12 节
  1. 包括中间软件:
  2. 创建承诺行动:
  3. 发出承诺行动:
  4. 在 saga 中解决/ 拒绝动作 :
  5. implementPromiseAction(action, saga)
  6. resolvePromiseAction(action, value)
  7. rejectPromiseAction(action, value)
  8. 行动生命周期 -- -- 减少承诺行动:
  9. 发出承诺行动
  10. 发送 sagas 动作的助手
  11. 参数验证
  12. 构建测试( T)

@adobe/redux-saga-保证

用于定义返回承诺的动作的简单清洁工具 红相

概览

图书馆提供:

  • 一个动作创造者, createPromiseAction() 用于定义返回承诺的动作。 我们要求行动 回报一个承诺 承诺行动。 。 。 .

  • 萨加帮手 implementPromiseAction(), (中文(简体) ), resolvePromiseAction(),以及rejectPromiseAction() 以便你们决心或拒绝约言.

  • 生命周期行动 promise.trigger, (中文(简体) ), promise.resolved,以及 promise.rejected 可以用于还原器(或任何地方)

  • 中间的软件,它的工作.

  • 为了方便,可选的 saga “效果创造者” dispatch() 简化发送承诺行动和普通行动 从sagas内部.

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

安装

同往常一样,通过:

npm install @adobe/redux-saga-promise

使用量

包括中间软件:

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

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 联 合 国 重排动作数字 :

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

export const myAction = createPromiseAction('MY_ACTION')

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

发出承诺行动:

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

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 函数抛出错误, 承诺 将因这个错误而被拒绝。 例如:

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() 第一个论点不是 承诺行动,它就会出错(参看 参数验证 页:1.

resolvePromiseAction(action, value)

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

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() 第一个论点不是 承诺行动,它就会出错(参看 参数验证 页:1.

rejectPromiseAction(action, value)

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

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() 第一个论点不是 承诺行动,它就会出错(参看 参数验证 页:1.

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

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

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

  • myAction.trigger: 用于 myAction即你们所派遣的使者,而你们却加以警告.

  • myAction.resolved自动发送 promiseMiddleware 当承诺实现时,其有效载荷就是承诺的确定价值

  • myAction.rejected自动发送 promiseMiddleware 当约言被否认的时候,其有效载荷是否认约言的

你可以轻松地用在 handleActions 联 合 国 重排动作数字 :

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 效果 :

const result = yield putResolve(myPromiseAction)

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

小心点! 如果您使用 put() 改为 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() 适当的。 例如,你可能已经:

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() - 说吧 如果行动是一种承诺行动, 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) 以调用函数。 那你就不用担心哪些行动是承诺行动,哪些不是承诺行动. 即:

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 无论如何,它会扔 错误(参见 参数验证 (见下文)

参数验证

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

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 但没有适当列入该商店.

捐款

欢迎捐款! 读取 贡献指南 更多信息.

构建测试( T)

package.json 定义常用脚本 :

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

测试是用 阿富汗 试跑者.

许可证发放

这个项目根据Apache V2许可证获得许可. 见 自由主义 更多信息.

版本与发布记录

@adobe/redux-saga-promise 共发布 3 个版本,首次发布于 2019/12/19;过去 12 个月发布了 0 个版本。

版本发布日期距今
1.1.1latest2020/05/096 年前
1.1.02020/03/116 年前
1.0.02019/12/196 年前

关于 @adobe/redux-saga-promise 的常见问题

@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 和提交记录判断。