生成器

  • 生成器大家用的都比较少呀!
//以下就是一个返回0-9迭代器的生成器函数
function* gen() {
  for (let i = 0; i < 10; i++) {
    yield i;
  }
}
for (const value of gen()) {
  console.log(value);
}
  • 运行一下试试
//以下就是一个返回0-9迭代器的生成器函数
function* gen() {
  for (let i = 0; i < 10; i++) {
    yield i;
  }
}
// 再看看返回的是个啥
console.log(gen().next()); //函数结果是个迭代器 需要next才有值

有啥用?

  • 重点其实在yield关键字上 这里是可以暂停函数执行的
  • 所以我们可以异步转同步
function* gen() {
  try {
    const res1 =  fetch("https://example.com");
    const data1 = yield res1.json();
    const res2 =  fetch("https://example.com/2");
    const data2 = yield res2.json();
  } catch (error) {
    console.error("Generator error:", error);
    throw error;
  }
}
  • 通过上述代码可以做到用同步的方式来处理异步请求
function runGenerator(genFn) {
  const gen = genFn();
  
  function iterate(iteration) {
    if (iteration.done) return iteration.value;
    
    const promise = iteration.value;
    promise.then(
      value => iterate(gen.next(value)),
      error => iterate(gen.throw(error))
    );
  }
  
  // 启动迭代
  iterate(gen.next());
}
 
// 调用执行器
runGenerator(gen);

你这也太麻烦了吧!

是的,所以现在大家都包上一层语法糖用。
async function asyncFunction() {
  try {
    const res1 = await fetch("https://example.com");
    const data1 = await res1.json();
    const res2 = await fetch("https://example.com/2");
    const data2 = await res2.json();
  } catch (error) {
    console.error("Async error:", error);
    throw error;
  }
}
  • 留个扣子提问 生成器还能干嘛?

生成器

展开查看

点击展开答案...

For Paul

这是一个个人博客,主要用于记录自己的学习过程,用于技术交流

© 2025 Paul Blog • Made withby Paul

使用 Next Rust 和 Tailwind CSS 构建

最近更新时间: 2025-07-01