Redux-Saga行为模式

时间:2017-12-11 12:46:06

标签: javascript redux-saga

这样的传奇非常有效:

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。 如何将坐标放到状态树中?

1 个答案:

答案 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)将无法像您期望的那样工作