redux-saga не работает с первого раза

У меня есть сага о сокращении, как показано ниже:

export function* loadApplianceSaga() {
  try {
    let {request, success, error} = yield take(ActionTypes.APPLIANCE.LOAD);
    request.url = yield select(getResourceLink, request.resource);
    const response = yield call(makeRequest, request);
    if (!response.error) {
      yield put({type: success, payload: response.body});
    } else {
      yield put({type: error, payload: response});
    }
  } catch (e) {
    yield put({type: ActionTypes.REQUEST.CALL_ERROR, error: e});
  }
}

export function* watchLoadAppliance() {
  while (true) {
    yield* takeEvery(ActionTypes.APPLIANCE.LOAD, loadApplianceSaga);
  }
}

и корневая сага:

export default function* rootSaga() {
  yield [
    fork(watchLoadAppliance)
  ]
}

Я столкнулся с проблемой, что loadApplianceSaga не работает с первого раза. Я вошел в систему и увидел, что в первый раз он отправлял только ActionTypes.APPLIANCE.LOAD действие, тогда никаких действий не отправлялось. Но во второй раз я вижу успешное или неудачное отправленное действие.

Может ли кто-нибудь сказать мне, что случилось? Заранее спасибо!

Обновленное действие:

export const loadAppliances = () => {
  return {
    type: ActionTypes.APPLIANCE.LOAD,
    request: {
      resource: Resources.Appliances,
      param: {
        page: 0,
        size: 5,
        sort: 'name,desc'
      },
      header: {
        Accept: 'application/json'
      }
    },
    success: ActionTypes.APPLIANCE.LOAD_SUCCESS,
    error: ActionTypes.APPLIANCE.LOAD_ERROR
  }
};

person An Nguyen    schedule 20.09.2016    source источник
comment
включает ли действие {запрос, успех, ошибка}?   -  person Kokovin Vladislav    schedule 20.09.2016
comment
Да, действие включает их всех.   -  person An Nguyen    schedule 20.09.2016
comment
Я добавил действие. @Utro   -  person An Nguyen    schedule 20.09.2016


Ответы (1)


вы использовали take два раза. пытаться

export function* loadApplianceSaga(action) {
  try {
    let {request, success, error} = action;
    request.url = yield select(getResourceLink, request.resource);
    const response = yield call(makeRequest, request);
    if (!response.error) {
      yield put({type: success, payload: response.body});
    } else {
      yield put({type: error, payload: response});
    }
  } catch (e) {
    yield put({type: ActionTypes.REQUEST.CALL_ERROR, error: e});
  }
}

export function* watchLoadAppliance() {
  while (true) {
    yield* takeEvery(ActionTypes.APPLIANCE.LOAD, loadApplianceSaga);
  }
}
person Kokovin Vladislav    schedule 20.09.2016
comment
Большое спасибо! Это работает. Не могли бы вы немного объяснить, почему я столкнулся с этой проблемой? Я новичок в redux-saga. - person An Nguyen; 20.09.2016
comment
также я думаю, вам не следует изменять действие @AnNguyen - person Kokovin Vladislav; 20.09.2016
comment
о, я рассмотрю это. Спасибо! - person An Nguyen; 20.09.2016
comment
о проблеме .. Я думаю, вы пытались получить действие через дополнительный take эффект в loadApplianceSaga, но takeEvery уже передали его loadApplianceSaga @AnNguyen - person Kokovin Vladislav; 20.09.2016