• Jobs
  • About Us
  • professionals
    • Home
    • Jobs
    • Courses and challenges
  • business
    • Home
    • Post vacancy
    • Our process
    • Pricing
    • Assessments
    • Payroll
    • Blog
    • Sales
    • Salary Calculator

0

150
Views
Reutilice Redux-Saga Logic/función entre componentes

Estoy trabajando en un proyecto que involucra múltiples sagas y reductores. Algunas de las sagas utilizadas son similares, quiero reutilizar su lógica en varios componentes.

Implementación actual:

 function* fetchUpComingMovies() { try { const res = yield call(getUpComingMovies); const { status, data } = res; if (status === 200 && data) { yield put(successGetUpComingMovies(res.data.results)); } } catch (error) { yield put(failureGetUpComingMovies(error?.message)); } } function* fetchCurrentShows() { try { const res = yield call(getOnTheAirShows); const { status, data } = res; if (status === 200 && data) { yield put(successGetCurrentShows(res.data.results)); } } catch (error) { yield put(failureGetCurrentShows(error?.message)); } } function* fetchTopRated({ payload }) { try { const res = yield call(getTopRated, payload); const { status, data } = res; if (status === 200 && data) { yield put(successGetTopRated(res.data.results)); } } catch (error) { yield put(failureGetTopRated(error?.message)); } } export default function* rootSaga() { yield all([ takeLatest(homeActionTypes.REQUEST_GET_UPCOMING_MOVIES, fetchUpComingMovies), takeLatest(homeActionTypes.REQUEST_GET_SHOWS, fetchCurrentShows), takeLatest(homeActionTypes.REQUEST_GET_TOP_RATED, fetchTopRated), ]);}

Como puede ver, el código dentro del bloque try/catch es similar, solo que las acciones correspondientes son diferentes . Hay más sagas de este tipo en otros componentes. Siento que estoy repitiendo el código y quiero reutilizar la funcionalidad en todos los componentes. ¿Cómo resolver este problema?

Cualquier ayuda sería apreciada. Gracias

almost 3 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Puedes usar una fábrica de sagas para producir las sagas.

 import { call, put, all, takeLatest } from 'redux-saga/effects'; // api const getUpComingMovies = () => []; const getOnTheAirShows = () => []; // action creator const successGetUpComingMovies = (payload) => ({ type: 'SUCCESS_GET_UP_COMING_MOVIES', payload }); const failureGetUpComingMovies = (payload) => ({ type: 'FAILURE_GET_UP_COMING_MOVIES', payload }); const successGetCurrentShows = (payload) => ({ type: 'SUCCESS_GET_CURRENT_SHOWS', payload }); const failureGetCurrentShows = (payload) => ({ type: 'FAILURE_GET_CURRENT_SHOWS', payload }); function sagaFactory(opts) { return function* saga(...args) { try { const res = yield call(opts.api, ...args); const { status, data } = res; if (status === 200 && data) { yield put(opts.successActionCreator(res.data.results)); } } catch (error) { yield put(opts.failureActionCreator(error?.message)); } }; } export default function* rootSaga() { yield all([ takeLatest( 'REQUEST_GET_UPCOMING_MOVIES', sagaFactory({ api: getUpComingMovies, successActionCreator: successGetUpComingMovies, failureActionCreator: failureGetUpComingMovies, }), ), takeLatest( 'REQUEST_GET_SHOWS', sagaFactory({ api: getOnTheAirShows, successActionCreator: successGetCurrentShows, failureActionCreator: failureGetCurrentShows, }), ), ]); }
almost 3 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Our process Sales
Legal
Terms and conditions Privacy policy
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recommend me some offers
I have an error