gpt4 book ai didi

javascript - 如何在任务管理器回调中使用yield React Native

转载 作者:行者123 更新时间:2023-11-28 03:40:49 25 4
gpt4 key购买 nike

我想在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()
])
}

最佳答案

在 javascript 中,如果您想使用 yield ,您需要从生成器函数中执行此操作,因此您必须将 LocationWatcher 回调重写为生成器函数,例如

TaskManager.defineTask('LocationWatcher', function* ({ data: { locations }, error }) {
...
});

也就是说,这不会完成您在这里寻找的内容 - redux-saga 只能从 saga 中分派(dispatch)产生的操作,而 LocationWatcher 回调则不能。我认为对你来说更好的方法是导入你的 redux 存储并直接从你的任务中分派(dispatch)你的操作。所以类似:

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 生成器。

关于javascript - 如何在任务管理器回调中使用yield React Native,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57316860/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com