You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 17:39:01