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

问题描述 投票:0回答:1

在探索.js'生成器函数'时,我已成功尝试使用生成器函数创建获取周期。我很难做到这一点,因为当尝试将响应解析为json时,代码总是在第二次收益时失败。但是,当我将数据参数传递回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();
javascript iterator arguments generator fetch
1个回答
0
投票

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

事实上,datafunction* fetchGenerator(data) {参数毫无意义,但这并不是你传递数据的地方。你用fetchGenerator();调用生成器函数。

承诺结果data被传递给gen.next(data);,这是yield表达式评估的值。给responsejson一个值是必要的,没有它,生成器函数将不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.