【问题标题】:Why does a generator function with arguments remember past fetch response为什么带有参数的生成器函数会记住过去的获取响应
【发布时间】:2018-09-12 12:09:03
【问题描述】:

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

错误代码:

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();

【问题讨论】:

  • 你为什么还要使用生成器而不是使用async/await
  • 只是想更好地理解整个“生成器函数”规范

标签: javascript iterator arguments generator fetch


【解决方案1】:

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

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

promise 结果data 被传递给gen.next(data);,这是yield 表达式计算的值。必须给responsejson 一个值,否则生成器函数将无法工作。

【讨论】:

  • 我还是一头雾水。如果我在调用 next 时不传递数据,响应会忘记它是一个承诺?
  • 不,iterator.value 是承诺。 data 是 promise 的结果 - 您希望 yield 表达式计算的结果。要让yield 产生一个值,您需要将该值传递给.next()
  • 啊,好的,知道了。有点难以习惯语法。简而言之,当将 yield 分配给变量时,它的值将是将在以下 .next(argument) 中传递的参数的值。如果没有传递参数,它将被设置为未定义。谢谢。我也推荐这篇文章。 davidwalsh.name/es6-generators 并已将一些基本示例上传到 Git:github.com/shaibam/Es6GenertorFunctionExamples
猜你喜欢
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 2020-05-15
  • 2010-09-28
相关资源
最近更新 更多