Dva: Est-ce que l'utilisation d'async/wait pour faire des effets asynchrones ne fonctionne pas ? Dois-je utiliser */yield ?

Créé le 9 oct. 2016  ·  11Commentaires  ·  Source: dvajs/dva

effets: {

/**
 * 数据查询
 * 
 * <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,
      },
    });
  }
}

},

faq

Commentaire le plus utile

@sorrycc Puisque vous avez également mentionné les scénarios qui doivent utiliser l'annulation ici, en fait, async/wait est suffisant dans la plupart des cas. Dans l'utilisation actuelle, utilisez generator/yield pour appeler async/await. C'est trop pénible. L'auteur peut envisager de prendre en charge les deux modes en même temps et laisser les utilisateurs choisir eux-mêmes, comme ajouter un élément de configuration et appeler le mode async/await après ouverture , Ou jugement adaptatif.

Tous les 11 commentaires

effets: {

/**
 * 数据查询
 * 
 * <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,
      },
    });
  }
}

},

Oui, l'effet ne prend en charge que le libellé du générateur. async et await peuvent être utilisés en dehors de l'effet, puis utilisez l'appel de rendement pour ajuster l'effet.

je comprends merci mon Dieu

Excusez-moi, effect aura-t-il une chance de prendre en charge l'async à l'avenir ? @désolé

Async n'a pas de générateur contrôlable, tel que cancel , c'est pourquoi redux-saga choisit d'utiliser un générateur.

Oh

@sorrycc Comment puis-je annuler un effet ?

@miaojiuchen Quelle est la scène ?Pourquoi annuler l'effet ?

@désolé, j'ai rencontré ce scénario :

  • effet 1 : la demande est réussie, un nombre est renvoyé et l'effet 2 est appelé - le compteur de soustraction est traité
  • effet 2 : while(true) => delay puis dispatch réducteur

C'est bien sur une page, mais si vous visitez d'autres pages et revenez ensuite à la page précédente, l'effet 2 sera répété.
Comment puis-je annuler l'effet de l'effet 1 puis déclencher l'effet 2 ?
Dois-je utiliser des abonnements de chemin pour appeler @@CANCEL_EFFECTS ?

Merci.

@sorrycc Puisque vous avez également mentionné les scénarios qui doivent utiliser l'annulation ici, en fait, async/wait est suffisant dans la plupart des cas. Dans l'utilisation actuelle, utilisez generator/yield pour appeler async/await. C'est trop pénible. L'auteur peut envisager de prendre en charge les deux modes en même temps et laisser les utilisateurs choisir eux-mêmes, comme ajouter un élément de configuration et appeler le mode async/await après ouverture , Ou jugement adaptatif.

Vous pouvez essayer redva , le même framework

Cette page vous a été utile?
0 / 5 - 0 notes