async/await 是 generator 和 promise 的语法糖
function co (generator) {
const g = generator()
function handleResult (result) {
if (result.done) return // 生成器函数结束
// 如果 yield 后面不是一个 Promise 对象,就把它包装成 Promise 对象
if (!result.value instanceof Promise) result.value = Promise.resolve(result.value)
result.value.then(data => {
handleResult(g.next(data))
}, error => {
g.throw(error)
})
}
handleResult(g.next())
}
// 使用
co(main)
/**
传入的一定要是一个 generator 函数
*/
function * main () {
try {
const users = yield ajax('/api/users.json')
console.log(users)
const posts = yield ajax('/api/posts.json')
console.log(posts)
const urls = yield ajax('/api/urls11.json')
console.log(urls)
} catch (e) {
console.log(e)
}
}