Redux Saga中react-native-dropdownalert与navigation无法共同运行如何解决
问题根因
你代码里的核心错误是误用了yield put:put是Redux Saga专门用来派发Redux Action的API,仅接受符合{type: xxx}格式的Action对象作为参数。
你当前的写法中:
yield put(DropDownHolder.getDropDown().alertWithType('success', '', '提示内容'))
会先执行alertWithType方法(所以你能看到弹框),再把该方法的返回值传给put。但alertWithType返回的不是合法Redux Action,put执行时抛出异常,直接进入代码的catch分支,后续的导航代码根本没有执行。
而你在componentDidUpdate中是直接调用两个实例方法,没有Redux Action的校验逻辑,所以运行正常。
修复方案
直接调用两个工具方法即可,不需要用put包裹,如果需要方便单元测试也可以用Saga的callAPI包裹:
export function* someAsyncSaga({ params, api, constant }) { try { const response = yield call(api, params) yield put({ type: constant.SUCCESS, payload: response }); if (response['Status']) { // 直接调用弹框方法 DropDownHolder.getDropDown().alertWithType( 'success', '', 'Alert showing just fine', ) // 直接调用导航方法 NavigationService.navigate('SomePage') // 可选:如果需要弹框显示1.5秒后再跳转,加一行延迟即可 // import { delay } from 'redux-saga/effects' // yield delay(1500) // NavigationService.navigate('SomePage') } } catch (error) { console.log(error, 'error') yield put({ type: constant.ERROR, payload: error }); } }
如果你习惯用Saga的效应API统一管理所有调用,也可以写成:
// 用call包裹调用,参数依次传入即可 yield call([DropDownHolder.getDropDown(), 'alertWithType'], 'success', '', 'Alert showing just fine') yield call(NavigationService.navigate, 'SomePage')
内容的提问来源于stack exchange,提问作者electroid
相关产品推荐
相关产品推荐

