Redux Saga: Какая разница между использованием yield call () и async / await? - PullRequest
1 голос
/ 19 мая 2019

Я использую шаблон Redux Saga, и он использует функции генератора, которые содержат экземпляры yield call(). В основном это выглядит так:

function *a(){
  yield call(<some function>);
}

yield takeLatest(SOME_ACTION, a)

Мои вопросы следующие:

1) Я правильно понял, что причина использования

function *a(){
  yield call(<some function>());
}

вместо

function a(){
  <some function>()
}

в том, что с первым функция генератора будет ждать, пока строка yield call не вернется, прежде чем продолжить, тогда как во втором вызове () будет вызываться асинхронно?

2) Если я прав насчет (1) ^^, то вызов some_function внутри a выглядит следующим образом:

async a() {
  await some_function();
}

Это правильно?

3) Если я прав насчет (2) ^^, то, похоже, единственная причина использования функций генератора вместо async / await состоит в том, что функции генератора можно вызывать из yield takeLatest и т. Д. Это правильно? Или за этим стоит какой-то другой разум?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

«yield» будет ждать, пока генератор не развернется к этой итерации «доходности».

Идея генератора саги (работника) состоит в том, чтобы генерировать специальные функции (так называемые «эффекты») с использованием создателей эффектов (put, call и т. Д.), А не просто делать что-то. Это позволяет организовать вызовы функций.

См. Также Redux Saga асинхронный / ожидающий шаблон

0 голосов
/ 22 мая 2019

Функции генератора более гибкие и могут использоваться для получения разных вещей в зависимости от того, сколько раз он используется.Пагинация какая-то приходит мне на ум.Вот несколько примеров функций генератора, которые было бы сложнее реализовать с использованием async/await:

https://github.com/getify/You-Dont-Know-JS/blob/master/async%20%26%20performance/ch4.md#multiple-iterators

...