Что за 🐠 генератор?
Ну, по определению:
Генераторы — это функции, из которых можно выйти, а затем снова войти. Их контекст (привязки переменных) будет сохранен при повторных входах.
Представляете, что это дает? 💭
ааа, опять определение.. 💤
Генераторы в JavaScript — особенно в сочетании с промисами — очень мощный инструмент для асинхронного программирования
Сценарий реального мира?
После прочтения всего этого определения давайте перейдем к его сути. :octocat:
Перед нами стояла интересная задача. Это должно было включить разбивку на страницы в одном из наших мобильных приложений при пролистывании вправо.
Значит, мы используем для этого генераторы?
Есть и другие возможные решения, генераторы - просто более чистое решение.
Как это сделать?
› Создать генератор
const asyncGetContent = async function* (){
const limit = 10; /* content per page */
let offset = 0; /* index of item to start from */
let totalCount = -1; /* -1 signifies failure */
while (offset === 0 || offset < totalCount) {
try {
const response = await (await fetch(<<url>>)).json();
offset = offset + limit;
totalCount = response["total-count"];
console.log(`offset + totalCount`, offset, totalCount);
yield response;
} catch (e) {
console.warn(`exception during fetch`, e);
yield {
done: true,
value: "error"
};
}
}
}
Это много, чтобы понять, давайте пройдемся по каждой строке.
⛄ у нас есть limit
, который определяет переменную для установки предела результатов по вашему выбору [не обязательно должна быть константой]
⛄ подготовьте fetch/ axios/ некоторый вызов API, запустите его с помощью await
, чтобы мы разрешили полученное обещание.
⛄ yield
ответ. Возврат будет обещанием, которое будет использовано асинхронной вызывающей стороной с использованием .next()
(мы вернемся к этому в следующем разделе).
⛄ давайте просто обработаем выборку
Как мне это использовать?
const contentGen = await asyncGetContent(); /* initate the generator */
Все, что осталось сделать, это инициировать и вызвать его внутри асинхронной функции как таковой:
после инициации мы можем позвонить туда, где это необходимо (например, смахнуть правой кнопкой мыши / нажать кнопку), чтобы получить результат
const content = await contentGen.next();
используйте content
[в данном случае ответ API] по мере необходимости
Если у вас есть вопросы, дайте нам знать в комментариях, и мы с нетерпением ждем ваших отзывов 🍻
Первоначально опубликовано на https://dev.to 7 мая 2020 г.