При вызове API с использованием генераторов функция next () returningPromise выдвигала ответ - PullRequest
0 голосов
/ 11 апреля 2020

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

  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

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

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

Ответы [ 3 ]

0 голосов
/ 11 апреля 2020

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

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

0 голосов
/ 11 апреля 2020

попробуйте:

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

(async () => console.log((await generator()).next()))()
0 голосов
/ 11 апреля 2020

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

Другой вызов next должен вернуть ваш результат.

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

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

...