¿Cómo puedo acceder a la redux estado dentro de una saga función?

Respuesta corta:

import { select } from 'redux-saga';
...
let data = yield select(stateSelectorFunction);
InformationsquelleAutor Adam Tal | 2016-06-12

3 Comentarios

  1. 173

    Como @markerikson ya lo dice, redux-saga expone una muy útil API select() para invocar un selector en el estado para obtener una parte de él se dispone en el interior de la saga.

    Por su ejemplo de una implementación simple podría ser:

    /*
     * Selector. The query depends by the state shape
     */
    export const getProject = (state) => state.project
    
    //Saga
    export function* saveProjectTask() {
      while(true) {
        yield take(SAVE_PROJECT);
        let project = yield select(getProject); //<-- get the project
        yield call(fetch, '/api/project', { body: project, method: 'PUT' });
        yield put({type: SAVE_PROJECT_SUCCESS});
      }
    }

    Además de la propuesta de doc por @markerikson, hay una muy buena tutorial de vídeo por D. Abramov que explica cómo utilizar selectors con Redux. Compruebe también este hilo interesante en Twitter.

    • Exactamente lo que yo quería.. no puedo creer que me perdí
  2. 27

    Esto es lo que «selector» funciones que son. Se pasa todo el árbol del estado, y que la devolución de algún pedazo del estado. El código que llama el selector no es necesario conocer donde en el estado de datos, sólo que fue devuelto. Ver http://redux.js.org/docs/recipes/ComputingDerivedData.html para algunos ejemplos.

    Dentro de una saga, la select() API se puede utilizar para ejecutar un selector.

    • Es interesante la forma en que esto fue escrito 3.5 horas antes el aceptado la respuesta, pero no proporcionan un ejemplo, por lo que no aceptó. Gracias de todos modos!
    • Estoy de acuerdo! Pero no se trata de lo rápido que responder a una pregunta aquí, pero ¿cómo de buena es tu respuesta. Creo que las respuestas deben ser simples y fáciles de leer. Esta respuesta no coincide y el aceptado respuesta fue mucho más fácil de entender.
    • sí, estoy de acuerdo 🙂
  3. 0

    He utilizado un eventChannel para el envío de una acción de una devolución de llamada dentro de la función de generador de

    import {eventChannel} from 'redux-saga';
    import {call, take} from 'redux-saga/effects';
    
    function createEventChannel(setEmitter) {
        return eventChannel(emitter => {
            setEmitter(emitter)
            return () => {
    
            }
          }
        )
    }
    
    function* YourSaga(){
        let emitter;
        const internalEvents = yield call(createEventChannel, em => emitter = em)
    
        const scopedCallback = () => {
            emitter({type, payload})
        }
    
        while(true){
            const action = yield take(internalEvents)
            yield put(action)
        }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here