Dva: Использование async / await для выполнения асинхронных эффектов не работает? Должен ли я использовать * / yield?

Созданный на 9 окт. 2016  ·  11Комментарии  ·  Источник: dvajs/dva

последствия: {

/**
 * 数据查询
 * 
 * <strong i="6">@param</strong> {any} { payload }
 * <strong i="7">@param</strong> {any} { select, call, put }
 */
query: async function ({ payload }, { select, call, put }) {
  await put({ type: 'show_loading' });
  payload.page = payload.page || 1;
  payload.limit = payload.limit || 10;
  let data = await call(query, '/home/course', payload);
  if (data) {
    await put({
      type: 'query_success',
      payload: {
        list: data.data,
        total: data.count,
        current: data.currentPage,
      },
    });
  }
}

},

Самый полезный комментарий

@sorrycc Поскольку вы также упомянули, в каких сценариях необходимо использовать отмену здесь, на самом деле в большинстве случаев достаточно async / await. В текущем использовании используйте генератор / yield для вызова async / await. Это слишком болезненно. Автор может рассмотреть возможность одновременной поддержки обоих режимов и позволить пользователям выбирать самостоятельно, например, добавление элемента конфигурации и вызов режима async / await. после открытия, или адаптивного суждения.

Все 11 Комментарий

последствия: {

/**
 * 数据查询
 * 
 * <strong i="6">@param</strong> {any} { payload }
 * <strong i="7">@param</strong> {any} { select, call, put }
 */
query: function* ({ payload }, { select, call, put }) {
  yield put({ type: 'show_loading' });
  payload.page = payload.page || 1;
  payload.limit = payload.limit || 10;
  let data = yield call(query, '/home/course', payload);
  if (data) {
    yield put({
      type: 'query_success',
      payload: {
        list: data.data,
        total: data.count,
        current: data.currentPage,
      },
    });
  }
}

},

Да, эффект поддерживает только формулировку генератора. async и await можно использовать вне эффекта, а затем использовать вызов yield для изменения эффекта.

Я понимаю, слава богу

Извините, а будет ли у Effect возможность поддерживать асинхронность в будущем? @sorrycc

Async не имеет управляемого генератора, такого как cancel , поэтому redux-saga решила использовать генератор.

ой

@sorrycc Как я могу отменить эффект?

@miaojiuchen Что это за сцена? Зачем отменять эффект?

@sorrycc Я столкнулся с таким сценарием:

  • эффект 1: запрос выполнен успешно, возвращается число и вызывается эффект 2 - счетчик вычитания обрабатывается
  • эффект 2: while (true) => задержка, а затем отправка редуктора

Это нормально для одной страницы, но если вы посетите другие страницы, а затем вернетесь на предыдущую страницу, эффект 2 будет повторяться.
Как я могу отменить эффект 1, а затем запустить эффект 2?
Должен ли я использовать подписку на пути для вызова @@ CANCEL_EFFECTS?

благодаря.

@sorrycc Поскольку вы также упомянули, в каких сценариях необходимо использовать отмену здесь, на самом деле в большинстве случаев достаточно async / await. В текущем использовании используйте генератор / yield для вызова async / await. Это слишком болезненно. Автор может рассмотреть возможность одновременной поддержки обоих режимов и позволить пользователям выбирать самостоятельно, например, добавление элемента конфигурации и вызов режима async / await. после открытия, или адаптивного суждения.

Вы можете попробовать redva , тот же фреймворк

Была ли эта страница полезной?
0 / 5 - 0 рейтинги