我想在TaskManager.defineTask回调函数中使用yield,并使用yield调度redux存储,但我做不到
我什么都试过了
import { all, put, call } from 'redux-saga/effects'
import * as TaskManager from 'expo-task-manager';
import * as Location from 'expo-location';
import * as Permissions from 'expo-permissions';
function* dispatchLocation(locations){
console.log("Entro d")
yield put({ type: 'permission/SET_LOCATION', data: locations })
}
TaskManager.defineTask('LocationWatcher', ({ data: { locations }, error }) => {
if (error) {
// check `error.message` for more details.
return;
}
console.log('enn')
yield dispatchLocation(locations)
});
function* watchLocation(){
let { status } = yield Permissions.getAsync(Permissions.LOCATION);
console.log(status)
if (status === 'granted') {
Location.startLocationUpdatesAsync('LocationWatcher',{})
}
}
export default function* rootSaga() {
//call(watchLocation())
yield all([
watchLocation()
])
}发布于 2019-08-02 12:11:19
在javascript中,如果你想使用yield,你需要通过一个生成器函数来实现,所以你必须将你的LocationWatcher回调重写成一个生成器函数,比如
TaskManager.defineTask('LocationWatcher', function* ({ data: { locations }, error }) {
...
});也就是说,这不会达到你在这里寻找的目标-- redux-saga只能从一个传奇中分派产生的动作,而LocationWatcher回调则不是。我认为这里对你来说更好的方法是导入你的redux存储,然后直接从你的任务中分派你的动作。所以就像这样:
import store from './path/to/redux/store';
TaskManager.defineTask('LocationWatcher', ({ data: { locations }, error }) => {
if (error) {
// check `error.message` for more details.
return;
}
console.log('enn')
store.dispatch({ type: 'permission/SET_LOCATION', data: locations })
});并完全取消dispatchLocation生成器。
https://stackoverflow.com/questions/57316860
复制相似问题