redux-saga有没有办法在异步结束后通知视图层?

大概是这样的:

准备用react-saga做为异步方案,但是由于是React-Native项目,
在很多请求成功后需要在视图层组件内调用一些原生接口,
所以需要视图层能知道什么时候异步任务结束,以及异步的处理结果。

以前在web端用的 dva 框架, 有一个特点就是当dispatch一个异步effect的时候, 会返回promise对象,然后在effect中返回处理结果, 视图层就可以知道异步拿到的结果。

现在直接用的redux-saga,有没有什么方案能实现这种特性?

阅读 2.9k
2 个回答

目前已经找到了解决的方案,感谢楼上这位大兄弟 @dablwow80 给的参考,
在这个基础上写了自己的处理,大概是这么个意思:


// 这个是我所有页面的基类, 最终所有页面都继承这个
// 封装这么一个方法 _dispatch,代替原本的dispatch

class Page extends React.Component {
    
  _dispatch = (action) => {
    return new Promise((resolve, reject) => {
      this.props.dispatch({
        type: action.type,
        payload: {
          ...action.payload,
          resolve,
          reject,
        },
      })
    })
  }

}

// 然后是具体页面上, 使用这个方法

class BootStrap extends Page {
  render() { 
    return ...
  }
  
  componentDidMount() {
    this.isLogin()
  }

  isLogin = async () => {
    await this._dispatch({ type: 'USER_ISLOGIN' })
    console.log('complete')
    SplashScreen.hide() // 视图层在请求完成后需要执行的其他操作
  }

}

// saga 里面,只要在异步完成后执行resolve, reject就可以了

function* userIsLogin({ payload }) {
  const { resolve } = payload
  const user = yield call(fetch_user)
  // ... other
  yield fork(resolve, user)
}

这就是最简单的一个栗子, 实际会有很多类似的场景, 需要在dispatch发出后,第一时间知道异步何时完成, 然后调用原生接口,或者其他组件方法, 而不能只依靠redux里传出来的props数据更新

使用call调用一个异步函数,完成后使用 put 再调用一个同步函数修改 state,这样可以么
其实不明白你说的是什么.dva 不就是在 saga 基础上封装的么

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题