1,callback
ajax(xxx, ()=>{
ajax(xxx, ()=>{
ajax(xxx, ()=>{
//callback函数体
})
})
})
解决了同步问题,排队执行。
但是回调地狱,对开发不友好。且不能try..catch,不能return
2,Promise
ajax(xxx).then(res => {...}) .then(res => {...}) .then(res => {...})
解决了回调地狱
但是无法取消Promise。错误也需要在回调中来捕获reject
3,Generator(co函数库)
function *fetch(){
yield ajax('xxx', () => {})
yield ajax('xxx', () => {})
}
let it = fetch();
let result1 = it.next();
let result2 = it.next();
指针不断指向下一个Task的方式(有yield标记的地方)
4,Async/Await
async function test(){
// 以下代码没有依赖性的话,完全可以使用 Promise.all 的方式
// 如果有依赖性的话,其实就是解决回调地狱的例子了
await fetch('XXX1')
await fetch('XXX2')
await fetch('XXX3')
}
let a = 0
let b = async () => {
a = a + await 10
console.log('2', a) // -> '2' 10
}
b()
a++
console.log('1', a) // -> '1' 1
//因为await内部实现了generator,会将a=0先保留下来。后面改变为1,也不影响这里。