設計模式概述
阿新 • • 發佈:2021-06-25
generator和函式不同的是,generator由function*
定義(注意多出的*
號)
除了return
語句,還可以用yield
返回多次
function* test() { let x = 1 yield x + 1; yield x + 2; return x + 3; } const gen = test() console.log(gen) console.log(gen.next()) console.log(gen.next()) console.log(gen.next()) console.log(gen.next())
generator還有另一個巨大的好處,就是把非同步回撥程式碼變成“同步”程式碼
例:
實現async await
function asyncFn() { return new Promise((resolve, reject) => { setTimeout(() => { console.log(111) resolve(222) }, 1000) }) } function asyncFn2() { return new Promise((resolve, reject) => { setTimeout(() => { console.log(333) resolve(444) }, 1000) }) } function* test() { yield asyncFn(); yield asyncFn2(); yield 'ddd'; return 3; } const gen = test() function step(gen) { const { value, done } = gen.next() res = value if(done) return // Promise.resolve如果引數是 Promise 例項,那麼Promise.resolve將不做任何修改、原封不動地返回這個例項。 Promise.resolve(value).then((res) => { step(gen) console.log(res) }) } step(gen)