Почему функция генератора с аргументами запоминает прошлый ответ выборки - PullRequest
0 голосов
/ 12 сентября 2018

Исследуя «генераторные функции» .js, я успешно попытался создать цикл выборки, используя функцию генератора. Мне было трудно сделать это, так как код всегда терпел неудачу на втором выходе, когда пытался проанализировать ответ как json. Но когда я передал аргумент данных обратно в функцию генератора, казалось, что все работает хорошо, я не понимаю, почему. поскольку функция генератора не использует аргумент данных.

Неправильный код:

const URI = 'some.json';
function* fetchGenerator() {
    const response = yield fetch(URI);
    const json = yield response.json(); //Uncaught (in promise) TypeError: Cannot read property 'json' of undefined
    return json
}
const gen = fetchGenerator();
const fetchSteps = () => {
    const iterator = gen.next();
    if (!iterator.done)
        iterator.value.then((data) => { fetchSteps() });
    else
        document.body.innerHTML = JSON.stringify(iterator.value);

}
fetchSteps();

Правильный код:

const URI = 'some.json';
function* fetchGenerator(data) {
    const response = yield fetch(URI);    
    const json = yield response.json();
    return json
}
const gen = fetchGenerator();
const fetchSteps = (data) => {
    const iterator = gen.next(data);    
    if (!iterator.done)
        iterator.value.then((data) => { fetchSteps(data) });
    else
        document.body.innerHTML = JSON.stringify(iterator.value);

}
fetchSteps();

1 Ответ

0 голосов
/ 12 сентября 2018

Кажется, я не понимаю, почему.поскольку функция генератора не использует аргумент данных.

Действительно, параметр data в function* fetchGenerator(data) { не имеет смысла, но это не то, где вы передаете данные в любом случае.Вы вызываете функцию генератора с помощью fetchGenerator();.

Результат обещания data передается в gen.next(data);, то есть в значение, которое оценивается выражением yield.Это необходимо для присвоения response и json значения, без которого функция генератора не будет работать.

...