在探索.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();
我似乎不明白为什么。因为生成器函数不使用data参数。
事实上,data
的function* fetchGenerator(data) {
参数毫无意义,但这并不是你传递数据的地方。你用fetchGenerator();
调用生成器函数。
承诺结果data
被传递给gen.next(data);
,这是yield
表达式评估的值。给response
和json
一个值是必要的,没有它,生成器函数将不起作用。