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]);
}