React native Redux传奇似乎阻止了执行,即使传奇是以“spawn”开头的`
我正在我的React Native应用程序中使用以下设置: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
connect
fromreact redux
启动操作,比如说类型MY_action
。action creator是一个位于GUI道具上的函数(connect
将其放在那里)。因此,GUI调用this.props.sendMyAction()
进行分派my_ACTION
,并在每次分派my_ACTION
时调用后台进程: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');
}