Учебник Дорожная карта

Функции генератора и итераторы?
Использование в асинхронном программировании (вызов API)

Функции генератора и итераторы

Генераторная функция — это функция, которая позволяет нам контролировать выполнение операторов в ней. то есть можно остановиться на полпути и продолжить с того места, где он ушел.

Ага! Мы можем извлекать любые значения из функции в любое время, используя yeild, и, что более удивительно, мы также можем передавать некоторые значения в функцию во время ее выполнения.

yeild ‘Anything’ // returns anything and pauses

Это управление потоком операторов стало возможным благодаря объектам итераторов.

Чтобы выразить Iterators на простом английском языке, это

Процесс зацикливания пользовательских объектов.

Хорошо, давайте посмотрим вышеприведенную теорию в действии

//Normal JS Function
function myName(){
   //Statements
   return 'Danish Ali';
   return 'Unreachable statement';
}
const Name = myName();
console.log(Name) // Danish Ali

Это нормальная работа функции в JS. Она работает до конца, следуя модели запуска до завершения.

//This is generator function in work
function* myNameGenerator(){
 
 yeild ‘My’
 yeild ‘Name is’
 yeild ‘Danish’
 return ‘Ali’
}
const nameGenerator = myNameGenerator
console.log(nameGenerator) //{[Iterator]} 
console.log(nameGenerator.next()) // {value:’My’, done: false}

Да, функция-генератор возвращает итератор (объект)
Итератор имеет метод next
next() возвращает объект
`{value: Any, done: true | false}`
значение является следующим значением от генератора и готово сообщает нам, способна ли функция генератора генерировать больше значений. т. е. когда done истинно, больше не нужно генерировать значения.

//Continuing previous code...
console.log(nameGenerator.next()) // {value:'Name is', done: false}
console.log(nameGenerator.next()) // {value:'Danish', done: false}
console.log(nameGenerator.next()) // {value:'Ali', done: true}

При возврате оператору done присваивается значение true, после чего генераторы больше не могут генерировать.

Использование в асинхронном программировании (вызов API)

Redux Saga Промежуточное ПО для Redux разработано с использованием функциональности, предлагаемой генераторами для достижения асинхронности.

Example of Login Api by using Generators used in redux saga

function* loginRequest(obj) {
  //console.log('loginRequest Generator Function Called');
const response = yield anyRequestFunction(data, 'Url');
//console.log('Login Request Working', response);
if (response.status === 200) {
    yield put(loginSuccess(response));
  } else if (response.status === 400) {
    yield put(loginFaliure(response));
  } else {
    yield put(loginFaliure(response));
  }
}

Здесь, когда вызывается API, он приостанавливается и выполняется в фоновом режиме, в то время как управление передается следующему оператору после вызова генератора.

Спасибо, что дочитали до конца, надеюсь, это было полезно для вас.
Удачного кодирования :)

Полезные ссылки