2017-10-12 4 views
0

Je veux utiliser redux-actions pour simplifier mon code de réaction-redux, mais j'ai une question:Comment exprimer une action REQUEST/START via redux-actions?

Dites que j'ai l'action "charger", qui récupère certains sujets de la télécommande. de sorte que le code serait:

const load = createActions('LOAD'); 

export function fetch() { 
    return (dispatch, getState) => { 
    dispatch(fetchTopicsRequest()); // <- here is my question. 
    return network 
     .request('/topics?' + qs.stringify(getState().topics.filter.options)) 
     .then(network.handleResponse) 
     .then(result => dispatch(load(result)))  // <- here I got the topics in the payload 
     .catch(error => dispatch(load(error)));  // <- here I got the errors in the payload, in the reducer I check on the "error" field to see if the request successed. 
    }; 
} 

Je pense qu'il est bon d'avoir le résultat et a été envoyé avec une seule action erreur. mais qu'en est-il du statut "Demandant" avec la même action? comme le code ci-dessus, je ne l'ai pas compris, donc je dois faire une autre action "fetchTopicsRequest()", cela rend le code entier si bizarre. Dès la disscusion précoce, j'ai remarqué qu'il y avait un champ "status", cela pourrait être utile dans un tel cas. où est-il allé? ou j'ai juste manqué une meilleure idée?

Merci

Répondre

0

Tout d'abord, je voudrais corriger votre compréhension de ce que vous appelez comme des actions. Dans votre cas, la fonction fetch() est un créateur d'actions capable de répartir les actions, load(result) et load(error) sont les actions réellement envoyées.

Maintenant, comme vous cherchez une meilleure implémentation de votre action fetchTopicsRequest(), je vous suggère d'utiliser la manière conventionnelle d'écrire une action. Dans votre cas, ce serait quelque chose comme ceci:

dispatch({type: 'FETCHING_TOPICS'}); 

vous pouvez maintenant saisir cette action dans votre réducteur et faire tout en votre topics sont FETCH.

MISE À JOUR:

Pour gérer le pending cas, vous pouvez utiliser la composition d'action et réducteur. Une fois que les FETCHING_TOPICS actions est distribué ensuite dans votre réducteur, vous pouvez marquer pending comme true et une fois que la response est reçue alors vous pouvez changer pending à false comme ceci:

function reducer(state={pending: null}, action) { 
    switch(action.type) { 
    case 'FETCHING_TOPICS': 
     return {...state, pending: true}; 
     break; 
    case 'FETCHED_TOPICS': 
     return {...state, pending: false, //payload if any}; 
     break; 
    case 'FETCHING_ERR': 
     return {...state, pending: false, //payload if any}; 
     break; 
    } 
} 
+0

Oh oui, votre droite. Je peux encore le corriger: les 'load (resultat)' et 'load (erreur)' sont aussi des créateurs d'action, l'action vraie est l'objet ordinaire qui a été réellement distribué. Ce que je veux dire, c'est qu'il y a un champ «error» pour l'état de l'action, mais il n'y a aucun moyen d'exprimer l'état «pending». Si j'ai besoin de connaître un tel statut, quelle est la meilleure façon de l'exprimer? –

+0

La meilleure façon de gérer un tel cas est d'utiliser le combo d'actions et de réducteurs. Ainsi, lorsque vous envoyez l'action '' '' FETCHING_TOPICS''', vous pouvez marquer '' '' pending''' comme '' '' '' '' '' '' '' '' true''' dans votre réducteur et lorsque vous envoyez '' '' '' 'result'' 'ou' '' error''' actions alors vous pouvez changer '' 'pending''' à' '' false''' dans votre réducteur. Je vais mettre à jour la réponse pour être un peu plus verbeux. –

+0

Désolé, mon pote. Je pense que je n'ai pas précisé que je parle de «actions de redux». la bibliothèque pour réduire le code standard. Je connais le modèle des trois actions, je veux juste utiliser des actions redux pour simplifier ma base de code. –