通过async await和Promise解决多个ajax异步请求之间存在依赖的情况
异步ajax请求之间可能会有依赖情况,本篇以定时器模拟请求,总结了几种通过async await和Promise将异步转为同步的方案
// get1请求、get2请求
function get1 () {
return new Promise((resolve, reject) => {
setTimeout(() => {
num1 += 1
console.log('get1执行')
resolve(num1)
}, 2000)
})
}
function get2 () {
return new Promise((resolve, reject) => {
setTimeout(() => {
num2 += 2
console.log('get2执行')
resolve(num2)
}, 1000)
})
}
1.异步请求,无依赖
get1 ()
get2 ()
// get2执行 get1执行
2.Promise.all():get3依赖get1和get2,get1和get2之间异步执行
Promise.all([get1(), get2()]).then((data) => {
console.log(data)
})
// get2执行 get1执行 [1, 2]
then的函数体会在get1和get2的回调完成后执行,参数data是get1和get2的resolve()参数值组成的数组
3.get3依赖get1和get2,且get1和get2同步执行
方案1:async await:
async function get3 () {
await get1()
await get2()
console.log(num1 + num2)
}
get3() // get1执行 get2执行 3
get3函数体会在get1和get2回调执行完执行
get1和get2同步执行,即get2会等get1回调执行后开始执行
方案2:Promise.all() await
async function get3 () {
Promise.all([await get1(), await get2()]).then((data) => {
console.log(data)
})
}
get3() // get1执行 get2执行 [1, 2]
4.get3依赖get1和get2,get1和get2有一个进入catch,阻塞get3
async function get3 () {
let get1Flage = await get1().catch(() => {
return false
})
if (!get1Flage) {
return // 不再继续执行
}
let get2Flage = await get2().catch(() => {
return false
})
if (!get2Flage ) {
return // 不再继续执行
}
console.log(num1 + num2)
}
确保只有get1和get2都成功才会执行get3
本文作者:李云蹊
本文链接:https://www.cnblogs.com/liyunxi/p/17566245.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步