为什么带有参数的生成器函数会记住过去的提取响应

时间:2018-09-12 12:09:03

标签: javascript iterator arguments generator fetch

在探索.js的“生成器函数”时,我已成功尝试使用生成器函数创建访存周期。 我很难做到这一点,因为当尝试将响应解析为json时,代码总是在第二次失败时失败。 但是,当我将数据参数传递回Generator函数时,一切似乎都运行良好,我似乎不明白为什么。因为generator函数不使用data参数。

错误代码:

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 :(得分:0)

  

我似乎不明白为什么。因为generator函数不使用data参数。

实际上,data的{​​{1}}参数是没有意义的,但是无论如何这都不是传递数据的地方。您可以使用function* fetchGenerator(data) {调用generator函数。

承诺结果fetchGenerator();传递到data表达式求值的值gen.next(data);。必须为yieldresponse赋予一个值,否则将无法生成函数。