二十七、知识点回顾
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)
})