@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.jsnpm test:构建,然后运行测试套件.
测试是用 阿富汗 试跑者.
许可证发放
这个项目根据Apache V2许可证获得许可. 见 自由主义 更多信息.