Вызов API с использованием генераторов, функции next() returnPromise, выдавал ответ

У меня есть два вопроса относительно генераторов, так как я только изучаю эту функцию.

  1. Не уверен, что не так в приведенной ниже реализации. Я рассчитывал, что результат будет
{
  "userId": 1,
  "id": 1,
  "title": "delectus aut autem",
  "completed": false
}

КОД:

function *generator(){
 const res = yield fetch('https://jsonplaceholder.typicode.com/todos/1'); 
 const response = yield res.json();
}

let g = generator();
g.next();
//PRINTS
> {value: Promise, done: false} //why the value here is  Promise, I was expecting the json object

Пожалуйста, помогите мне понять, что не так в приведенном выше коде.

  1. Мой второй вопрос: я не понимаю и не понимаю вариантов использования генератора, я имею в виду, где мы можем использовать такие приостанавливаемые функции в реальных проектах.

3 ответа

Вам нужно сначала дождаться разрешения выборки, вы можете сделать это с помощью.then() или сделать генератор асинхронным и дождаться выборки. Хотя в наши дни от этого было бы мало толку. До появления async/await или даже promises люди использовали генераторы, как если бы вы использовали async/await сегодня с чем-то вроде co wrap, основанного на обратных вызовах.

Что касается их использования сегодня, вы можете найти их в таких библиотеках, как redux-saga, но в основном они были заменены на async/await и promises, которые намного легче и понятнее.

Генератор вернет все, что вы вернете после yield. В вашем случае вы возвращаете обещание, потому что это то, что вы возвращаете после первого yield.

Еще один звонок next должен вернуть ваш результат.

Одним из вариантов использования генератора может быть, например, создание бесконечного списка. Вы не можете сохранить его, но можете генерировать по одному элементу за раз и, скорее всего, остановиться в какой-то момент.

В общем, генератор очень полезен, когда вы не хотите или не можете генерировать полный список объектов, и вы делаете это по одному элементу за раз.

Попытайся :

async function* generator() {
    yield (await fetch('https://jsonplaceholder.typicode.com/todos/1'))
        .json()
}

(async () => console.log((await generator()).next()))()

Другие вопросы по тегам