Solución:
¿Podría proporcionar más información sobre su problema? No estoy seguro de haber entendido correctamente su problema, pero la práctica común es:
API.js
function apiCallToFetchPost(id) {
return Promise.resolve({name: 'Test});
}
postSaga.js
function* fetchPostSaga({id}) {
try {
const request = yield call(apiCallToFetchPost, id);
// -> in post reducer we will save the fetched data for showing them later
yield put({type: FETCH_POST_SUCCESS, payload: request});
} catch (error) {
yield put({type: FETCH_POST_SUCCESS_FAILURE, error})
}
}
export function* onBootstrap() {
yield takeLatest(FETCH_POST, fetchPostSaga);
}
Hay un paquete que hace exactamente lo que solicitó el OP, es decir, organiza que dispatch()
puede devolver una promesa: @ adobe / redux-saga-promise Al usarla, define un creador de “acción de promesa” a través de:
import { createPromiseAction } from '@adobe/redux-saga-promise'
export const fetchPostAction = createPromiseAction('FETCH_POST')
los dispatch()
de una “acción de promesa” devolverá una promesa:
await dispatch(fetchPostAction({ id: 'post-id' }))
La saga podría verse así:
import { call, takeEvery } from 'redux-saga/effects'
import { implementPromiseAction } from '@adobe/redux-saga-promise'
import { fetchPostAction } from './actions'
function * fetchPostSaga(action) {
yield call(implementPromiseAction, action, function * () {
const { id } = action.payload
return yield call(apiCallToFetchPost, id)
})
}
export function * rootSaga() {
yield takeEvery(fetchPostAction, fetchPostSaga);
}
Resolverá la promesa con el valor devuelto por apiCallToFetchPost
o rechazar si apiCallToFetchPost
arroja un error. También despacha acciones secundarias con la resolución / rechazo a las que puedes acceder en un reductor. El paquete proporciona middleware que debe instalar para que funcione.
(Descargo de responsabilidad, soy el autor)