Redux Saga async/ждет модель
Я использую async/wait во всей своей кодовой базе. Из-за этого мои вызовы api определяются асинхронными функциями
async function apiFetchFoo {
return await apiCall(...);
}
Я хотел бы назвать эту функцию из моего кода саги. Похоже, я не могу этого сделать:
// Doesn't work
function* fetchFoo(action) {
const results = await apiFetchFoo();
yield put({type: "FOOS_FETCHED_SUCCESSFULLY", foos: results});
}
Однако это работает и соответствует документации саги о редукции:
// Does work
function* fetchFoo(action) {
const results = yield call(apiFetchFoo);
yield put({type: "FOOS_FETCHED_SUCCESSFULLY", foos: results});
}
Является ли это правильным способом использования Redux Saga рядом с async/wait? Стандартно использовать этот синтаксис генератора внутри кода саги и шаблон async/await в другом месте?
Ответы
Ответ 1
Да, это стандартный способ использования Redux-Saga.
Вы никогда не должны называть функцию await
непосредственно внутри генератора саги, потому что сокращение-сага для организует побочные эффекты. Поэтому в любое время, когда вы хотите запустить побочный эффект, вы должны сделать это, получив побочный эффект с помощью эффекта redux-saga
: call
или fork
. Если вы делаете это напрямую, не используя эффект redux-saga
, redux-saga
не сможет организовать побочный эффект.
Если вы думаете об этом, генератор, который работает, полностью тестируется без необходимости насмешек. Кроме того, это помогает держать все в развязке: если ваш apiFetchFoo
вернул обещание, сага все равно будет работать одинаково.
Ответ 2
await
всегда работают внутри функции, объявленной как async
. #thumbRule
async function fetchList () {
let resp = await fetchApi([params]);
}