异步编程(Asynchronous) - 13 Promise - Generator生成器的使用-2
改写执行器函数
function ajax(url) {
// Promise接受一个函数作为参数,这个函数接受2个参数 (resolve函数/reject函数)
return new Promise(function (resolve, reject) {
var xhr = new XMLHttpRequest()
xhr.open('GET', url)
xhr.responseType = 'json'
xhr.onload = function () {
if (this.status == 200) {
console.info('Success!')
resolve(this.response)
} else {
console.info('Error!')
reject(new Error(this.statusText))
}
}
xhr.send()
})
}
// 生成器函数
function* main() {
try {
const users = yield ajax('/api/users.json')
console.info('users', users)
const posts = yield ajax('/api/posts.json')
console.info('posts', posts)
const urls = yield ajax('/api/urls.json')
console.info('urls', urls)
const urls1 = yield ajax('/api/urls11.json')
console.info('urls1', urls1)
} catch (e) {
console.info(e)
}
}
// 生成器的 >>>> 执行器函数
function co(generator) {
// 获取生成器对象
const g = generator()
// 生成器函数的执行器
function handleResult(result) {
if (result.done) return // 生成器函数结束
result.value.then(data => {
handleResult(g.next(data)) // 上一次请求的结果作为next参数传递并执行下一次next操作,在实际应用场景中.这个data可能是下一次调用的参数
}, error => {
g.throw(error)
})
}
handleResult(g.next())
}
// 将生成器函数直接传入执行器函数,在其内部获取生成器对象
// const g = main()
co(main)
Keep learning

浙公网安备 33010602011771号