Dva: Essayez de prendre en charge la promesse de retour pour l'expédition (EFFECT_ACTION)

Créé le 19 oct. 2016  ·  10Commentaires  ·  Source: dvajs/dva

Commentaire le plus utile

@nickzheng essayez cette méthode :

Utilisez la promesse pour envelopper la répartition dans le composant, par exemple :

   new Promise((resolve, reject) => {
      dispatch({
         type: 'users/create',
         payload: {
             values,
             resolve,
             reject,
         },
      }); 
   })
   .then( res => {
      console.log(res);
   })
  .catch( err => {
      console.log(err);
  })

Et dans l'effet dva, vous pouvez l'écrire comme ceci :

* create({ payload }, { put, call }) {
  const { value, resolve, reject } = payload;
  // 一些操作之后

  if (success) {
     resolve('done');
  } else {
     reject('error');
  }
}

L' idée précédente de

Tous les 10 commentaires

1. Si je veux intégrer la fermeture asynchrone, https://ant.design/components/modal-cn/#components -modal-demo-async, onOk doit accepter une promesse dans alors this.setState({
visible : faux,
confirmLoading : false,
});

Après avoir envoyé une action dans dva,
envoi({
tapez:'utilisateurs/créer',
charge utile : valeurs,
}); La valeur n'est pas une promesse, mais une action.

  1. La solution peut être de mettre les états visible et confirmLoading dans le store.

    1. Est-il possible qu'après avoir envoyé une action dans dva, ce soit une promesse, et redux-thunk soit une promesse. Mon plat est peut-être que la mise en œuvre de la saga est différente.

@nickzheng essayez cette méthode :

Utilisez la promesse pour envelopper la répartition dans le composant, par exemple :

   new Promise((resolve, reject) => {
      dispatch({
         type: 'users/create',
         payload: {
             values,
             resolve,
             reject,
         },
      }); 
   })
   .then( res => {
      console.log(res);
   })
  .catch( err => {
      console.log(err);
  })

Et dans l'effet dva, vous pouvez l'écrire comme ceci :

* create({ payload }, { put, call }) {
  const { value, resolve, reject } = payload;
  // 一些操作之后

  if (success) {
     resolve('done');
  } else {
     reject('error');
  }
}

L' idée précédente de

https://github.com/dvajs/dva-core/blob/0fa6888/test/effects-test.js#L332 -L365, l'envoi de support intégré (EffectAction) renvoie la promesse.

@sorrycc en aime un, demandez quelle version de cette fonctionnalité a été ajoutée ? Vous n'avez pas l'air de voir le journal des modifications ?

@daskyrk etc #772

Il est pris en charge dans dva@2 .

Après la prise en charge intégrée des promesses, comment définir la résolution et le rejet en vigueur ?
Comment compter comme un succès, comment compter comme un échec ?
Dans la solution fournie par

   new Promise((resolve, reject) => {
      dispatch({
         type: 'users/create',
         payload: {
             values,
             resolve,
             reject,
         },
      }); 
   })
   .then( res => {
      console.log(res);
   })
  .catch( err => {
      console.log(err);
  })

La promesse intégrée signifie-t-elle transformer le haut en bas ?

dispatch({
  type: 'users/create',
  payload: {
    values,
    resolve,
    reject,
  },
})
  .then(res => {
    console.log(res);
  })
  .catch(err => {
    console.log(err);
  })

projet

const { dispatch } = this.props;
dispatch({
   type: 'specification/fetch',
    payload: applicationId,
 }).then((data) => {
     console.log(data)
 });

maquette

 effects: {
    * fetch({ payload }, { call, put, select}) {
      const response = yield call(querySpecification, payload);
      yield put({
        type: 'list',
        payload: response
      });
      return yield select(state => state.specification.list);  //important
    }
},
reducers: {
    list(state, action) {
      return {
        ...state,
        list: action.payload
      };
    }
  }

@Youthink Que faire dans ma situation comme ci-dessous

projet

this.props.dispatch({
    type: 'app/login',
    payload: {
        phone: '13312332131',
        smscode: '6666',
    }
}).then(data => {
    console.log('success result', data)
}).catch(err => {
    console.warn('error result', err)
})

maquette

*login({ payload }, { call, put }) {
    // 请求状态 fetching 为 true,方便页面显示loading状态
    yield put({ type: 'updateState', fetching: true })
    // 这里进行登录 service
    const login = yield call(authService.login, payload)
    // 如果上面的 authService.login 异常了,下面的逻辑就不会进行了,下面的 fetching 设置为 false 也不会执行到
    if (login) {
        yield put(NavigationActions.back())
        Storage.set('login', login)
    }
    // 这里重置下 状态 fetching 为 false
    yield put({type:'updateState', fetching: false })
},

Je pense que peu importe si le backend renvoie le succès ou s'il y a une exception, il peut être exécuté à yield put({type:'updateState', fetching: false }) . Je sais qu'il est possible d'envoyer une dépêche au modèle pour définir la récupération dans le projet, indépendamment du succès ou de l'échec, mais cela ne me semble pas très approprié de le faire.

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