前端那些事

vuePress-theme-reco chenpeng    2020 - 2021
前端那些事 前端那些事

Choose mode

  • dark
  • auto
  • light
首页
文章目录
  • Browser
  • CSS
  • ES6
  • JavaScript
  • Network
  • TypeScript
  • Vue
  • Vue3
  • Webpack
标签
时间轴
GitHub
author-avatar

chenpeng

85

Article

25

Tag

首页
文章目录
  • Browser
  • CSS
  • ES6
  • JavaScript
  • Network
  • TypeScript
  • Vue
  • Vue3
  • Webpack
标签
时间轴
GitHub
  • ES6-异步

    • Generator生成器函数
    • Promise
    • async与await

Generator生成器函数

vuePress-theme-reco chenpeng    2020 - 2021

Generator生成器函数

chenpeng 2020-11-30 ES6异步

# 1.概念

ES6 引入了 Generator 函数,可以通过 yield 关键字,把函数的执行流挂起,为改变执行流程提供了可能,为异步编程提供了解决方案

# 2.声明 Generator 函数

function* gen() {}
1

# 3.使用 yield 表达式

yield 是 Generator 函数中暂缓执行的标识,yield 只能在 Generator 函数中使用,在普通函数中使用会报错

function* gen() {
    yield 1;
}
1
2
3

在 Generator 函数中还有 yield* 这个表达式,用于在 Generator 函数内部,调用另一个 Generator 函数

function* foo() {
    yield 'a';
    yield 'b';
}
function* gen() {
    yield* foo();
}
1
2
3
4
5
6
7

上述代码等价于

function* gen() {
    for(let value of foo()){
        yield value;
    }
}
1
2
3
4
5

# 4.使用 next 方法

Generator 函数直接调用并不会执行,需要调用 next 方法才会执行

function* gen() {
    yield 1;
}
let g = gen();
console.log(g.next()); // {value: 1, done: false}
console.log(g.next()); // {value: undefined, done: true}
1
2
3
4
5
6

gen 函数返回的是一个 Iterator 对象,利用 next 方法对 Iterator 对象进行遍历

next 方法传参

一般情况下,next 方法不传入参数时,yield 的表达式是一个 undefined 对象;当 next 方法传入参数的时候,该参数会作为上一步 yield 的返回值

function* gen() {
    let x = yield 1;
    console.log(x);
}

let g = gen();
console.log(g.next()); 
// {value: 1, done: false}
// 10
g.next(10);
1
2
3
4
5
6
7
8
9
10

除了使用 next 方法,还可以使用 for...of 遍历 Generator 函数生成的 Iterator 对象

# 5.使用 return 方法

return 方法返回给定值,并结束遍历 Generator 函数;return 方法传入参数时,返回该参数,没有传入参数时,返回 undefined

function* gen() {
    yield 1;
}

let g = gen();
console.log(g.return('gen')); // {value: "gen", done: true}
1
2
3
4
5
6