这样的传奇非常有效:
function* getPosition() {
yield navigator.geolocation.getCurrentPosition(function(pos) {
console.log(`I am getPosition: ${pos.coords.latitude}, ${pos.coords.longitude}`);
});
}
但我需要Redux状态树中的坐标。所以,我尝试了一些模式,但没有一个模式可行。 1)无法从getCurrentPosition范围中获取变量
function* getPosition() {
let position = {};
yield navigator.geolocation.getCurrentPosition(function(pos) {
position = pos;
});
// either
console.log(`I am getPosition: ${position.coords.latitude}, ${position.coords.longitude}`);
// or
yield console.log(`I am getPosition: ${position.coords.latitude}, ${position.coords.longitude}`);
// Any of two is undefined
}
2)无法返回并指定值:
function* getPosition() {
const position = yield navigator.geolocation.getCurrentPosition(function(pos) {
return pos;
});
yield console.log(`I am getPosition: ${position.coords.latitude}, ${position.coords.longitude}`);
}
3)方法put没有效果:
function* getPosition() {
yield navigator.geolocation.getCurrentPosition(function(pos) {
// Pos fetched
console.log(`I am getPosition: ${pos.coords.latitude}, ${pos.coords.longitude}`);
// Nothing happens. State is empty object.
put({
type: LOCATION_SET_POSITION,
pos
});
});
}
locationReducer位于rootReducer内部,因为其他工作的reducer是:
locationReducer.js
export function locationReducer(state = {}, action) {
switch (action.type) {
case LOCATION_SET_POSITION:
return action.pos
default:
return state;
}
}
我没有actionCreater。据我所知,put
方法都是
调度动作并设置actionCreator。
如何将坐标放到状态树中?
答案 0 :(得分:3)
你的问题是geolocation.getCurrentPosition
是异步的,但是处于成功/错误回调样式,而你需要它作为一个承诺被送到redux-saga
function* getPositionSaga() {
const getCurrentPosition = () => new Promise(
(resolve, reject) => navigator.geolocation.getCurrentPosition(resolve, reject)
)
const pos = yield call(getCurrentPosition)
yield put({type: LOCATION_SET_POSITION, pos})
}
这里我们将getCurrentPosition
包装到一个返回Promise<Position>
call
是一个redux-saga效应,如果它给出的函数返回一个promise,它只会在满足该promise时产生,并且会将已完成的值返回到你的传奇中以供进一步使用。
put
是一种效果,最终将通过redux
任何redux-saga效果必须从生成器产生,而不是直接调用,因为它们只返回一个简单的redux-saga中间件执行器指令对象(而不是立即实际执行副作用)。执行程序只能在从生成器中获取时访问和控制它们,因此在回调中使用它们(如示例3)将无法像您期望的那样工作