一路繁花似锦绣前程
失败的越多,成功才越有价值

导航

 

二十七、知识点回顾

1、回调函数方式处理异步所存在的问题
* 无法捕获错误(try catch)
* 不能return
2、生成器
function* foo(a) {
  const b = yield a
  const c = yield b
  return c
}

const iter = foo(1)
console.log(iter.next())
console.log(iter.next(2))
console.log(iter.next(3))
/*
// 伪代码
function foo(a) {
  // 相当于从:foo(a) 执行到 yield a
  // 可通过foo()传入参数
  function 第一个next() {
    return { value: a, done: false }
  }
  // 相当于从:const b 执行到 yield b
  // 可通过第二个next()传入参数
  function 第二个next(b) {
    return { value: b, done: false }
  }
  // 相当于从:const c 执行到 return c
  // 可通过第三个next()传入参数
  function 第三个next(c) {
    return { value: c, done: true }
  }
}
*/
3、从Generator到async/await
// co.wrap原理
function wrap(gen) {
  return function (...args) {
    const it = gen(...args)
    return new Promise(resolve => {
      (function next(res) {
        const {value, done} = it.next(res)
        if (done) {
          resolve(value)
        } else {
          Promise.resolve(value).then(next)
        }
      })()
    })
  }
}

// 需要安装:npm i co
// const {wrap} = require('co')
const foo = wrap(function* (a) {
  const b = yield Promise.resolve(a + 1)
  const c = yield Promise.resolve(b + 1)
  return c + 1
})
/*
// 相当于
const foo = async function (a) {
  const b = await Promise.resolve(a + 1)
  const c = await Promise.resolve(b + 1)
  return c + 1
}
*/

foo(1).then(res => {
  console.log(res)
})
posted on 2024-03-27 19:38  一路繁花似锦绣前程  阅读(10)  评论(0编辑  收藏  举报