React native Redux传奇似乎阻止了执行,即使传奇是以“spawn”开头的`

React native Redux传奇似乎阻止了执行,即使传奇是以“spawn”开头的`,react-native,redux-saga,React Native,Redux Saga,我正在我的React Native应用程序中使用以下设置: GUI使用connectfromreact redux启动操作,比如说类型MY_action。action creator是一个位于GUI道具上的函数(connect将其放在那里)。因此,GUI调用this.props.sendMyAction()进行分派 在我的根传奇中,我有以下分派器,它侦听my_ACTION,并在每次分派my_ACTION时调用后台进程: 这似乎奏效了。但是,JS线程似乎只有在后台故事完成后才返回GUI: this

我正在我的React Native应用程序中使用以下设置:

  • GUI使用
    connect
    from
    react redux
    启动操作,比如说类型
    MY_action
    。action creator是一个位于GUI道具上的函数(
    connect
    将其放在那里)。因此,GUI调用
    this.props.sendMyAction()
    进行分派
  • 在我的根传奇中,我有以下分派器,它侦听
    my_ACTION
    ,并在每次分派
    my_ACTION
    时调用后台进程:
  • 这似乎奏效了。但是,JS线程似乎只有在后台故事完成后才返回GUI:

    this.props.sendMyAction();
    console.info('Sent action!');              // <---- only called after backgroundSaga finishes
    
    this.props.sendMyAction();
    
    console.info('send action!');// 背景故事是干什么的?如果它以一个同步代码块开始,那么在控制返回到父saga、redux或组件之前,该代码必须完成执行

    当您调用
    yield spawn(backgroundSaga)
    时,您将创建一个独立的传奇,并开始运行该传奇。这部传奇将一直持续到它
    产生
    异步的东西(通常是一个承诺)。子传奇分离的事实意味着即使子传奇没有完成,父传奇也有可能完成,但父传奇仍然需要等待子传奇
    产生
    。只有当子传奇产生时,控制才会返回到父传奇,然后返回到redux,然后返回到您的react组件

    例如,假设我有以下内容:

    function* myActionWatcher() {
      yield takeEvery(MY_ACTION, function*() {
        console.log('PARENT: about to spawn');
        yield spawn(backgroundSaga);
        console.log('PARENT: after spawn');
      });
    }
    
    
    function* backgroundSaga() {
      console.log('CHILD: starting saga');
      const state = yield select();
      console.log('CHILD: after select');
      yield Promise.resolve();
      console.log('CHILD: after resolve');
    }
    
    此操作的日志顺序为:

    • '父项:即将生成'
    • “孩子:开始传奇”
    • '子:在选择之后'
    • '父项:在繁殖之后'

    • “发出行动!”谢谢,这正是我所期望的。然而,我的saga确实有异步的收益(比如AJAX查询),但是在saga完成之前,GUI是被阻塞的。我得去别处找问题。如果我们使用fork而不是spawn,那么日志“PARENT:after spawn”将位于末尾,对吗?
      如果我们使用fork而不是spawn,那么日志“PARENT:after spawn”将位于末尾,对吗?
      更正这与我们在应用程序中注意到的相同-redux传奇的传奇甚至压倒了主JS线程
      setInterval()
      调用被延迟或根本不执行。我们确实有很多传奇故事,但是。。。。。
      function* myActionWatcher() {
        yield takeEvery(MY_ACTION, function*() {
          console.log('PARENT: about to spawn');
          yield spawn(backgroundSaga);
          console.log('PARENT: after spawn');
        });
      }
      
      
      function* backgroundSaga() {
        console.log('CHILD: starting saga');
        const state = yield select();
        console.log('CHILD: after select');
        yield Promise.resolve();
        console.log('CHILD: after resolve');
      }