Саги используются для обработки побочных эффектов. Вы можете использовать put
для отправки действия прямо из вашей саги.
Вот пример из официальной саги редукс-саги документы
import { call, put, takeEvery, takeLatest } from 'redux-saga/effects'
import Api from '...'
// worker Saga: will be fired on USER_FETCH_REQUESTED actions
function* fetchUser(action) {
try {
const user = yield call(Api.fetchUser, action.payload.userId);
yield put({type: "USER_FETCH_SUCCEEDED", user: user});
} catch (e) {
yield put({type: "USER_FETCH_FAILED", message: e.message});
}
}
поэтому если я напишу ваш код, это будет примерно так:
import uuid from 'uuid';
import { SET_ALERT, REMOVE_ALERT } from './types';
import { put } from 'redux-saga/effects'
export const setAlert = (msg, alertType, timeout = 5000) => {
const id = uuid.v4();
put({
type: SET_ALERT,
payload: { msg, alertType, id }
});
setTimeout(() => put({ type: REMOVE_ALERT, payload: id }), timeout);
};
В вашей рабочей саге:
function* someAction(action) {
try {
// some logic
yield setAlert(msg, 5000);
} catch (e) {
// some error handling logic
}
}
Я не проверял это, однако это должно работать.