JavaScript Generator 是一种特殊的函数,它可以在执行过程中暂停和恢复。Generator 函数使用 function*
声明,并且可以包含一个或多个 yield
表达式。当 Generator 函数被调用时,它返回一个迭代器对象,该对象可以用于控制函数的执行流程。
function*
声明的函数。next()
方法来控制执行流程。yield
关键字,使异步代码看起来更像同步代码,提高可读性。yield
表达式。yield
表达式,用于复杂的逻辑控制。// 简单 Generator 示例
function* simpleGenerator() {
yield 1;
yield 2;
yield 3;
}
const gen = simpleGenerator();
console.log(gen.next()); // { value: 1, done: false }
console.log(gen.next()); // { value: 2, done: false }
console.log(gen.next()); // { value: 3, done: false }
console.log(gen.next()); // { value: undefined, done: true }
// 异步 Generator 示例
function* asyncGenerator() {
const result1 = yield fetch('https://api.example.com/data1');
const data1 = yield result1.json();
console.log(data1);
const result2 = yield fetch('https://api.example.com/data2');
const data2 = yield result2.json();
console.log(data2);
}
function run(generator) {
const iterator = generator();
function iterate(iteration) {
if (iteration.done) return iteration.value;
return iteration.value.then(res => iterate(iterator.next(res)));
}
return iterate(iterator.next());
}
run(asyncGenerator);
yield
表达式没有正确暂停函数执行。原因:可能是由于 yield
后面没有跟有效的表达式,或者 yield
被错误地放置在了非 Generator 函数中。
解决方法:
yield
后面有有效的表达式。function*
。// 错误示例
function wrongGenerator() {
yield; // 缺少有效表达式
}
// 正确示例
function* correctGenerator() {
yield 1; // 正确使用 yield
}
通过以上解释和示例代码,希望能帮助你更好地理解和使用 JavaScript Generator。
领取专属 10元无门槛券
手把手带您无忧上云