1.传统异步处理
function asyncDouble(num,cb){
var complite = false
var result = null
var timeOut = Math.random() * 3
console.log('timeOut = ',timeOut)
setTimeout(() => {
result = num * 2
complite = true
},timeOut * 1000)
var timer = setInterval(() => {
if(complite){
cb && cb(result)
clearInterval(timer)
}
},100)
}
asyncDouble(5,function(result){
console.log(result)
})
2.Promise处理异步
- Promise定义:Promise是为了解决ES5中回调地狱而诞生的,Promise,顾名思义,就是承诺以后执行
- Promise创建:Promise是一个构造函数,构建示例时接收一个异步函数,创建的同时会把传入的函数执行一遍,所以需要把它封装到一个函数内部,直到函数调用时才创建promise,并执行里面的代码
- 成功与失败:传入的异步函数有2个参数(resolve,reject),成功调用resolve并把结果传递给它,失败则调用reject
//创建一个支持promise的异步方法
<script>
function asyncDoubleForPromise(num){
return new Promise(function(resolve,reject){
setTimeout(() => {
if(isNaN(num)){
reject()
}else{
resolve(num*2)
}
},1000)
})
}
</script>
- 使用then()处理异步结果:resolve对应的是then()的第一个参数,reject对应then()的第二个参数
asyncDoubleForPromise(5).then(res=>{
console.log(res)
})
asyncDoubleForPromise('a').then(function(res){
console.log('执行成功')
},function(){
console.log('执行失败')
})
asyncDoubleForPromise('a').then(res=>{
console.log(res)
}).catch(function(){
console.log('执行失败')
})
3.Async/await
- async和await关键字让我们可以用一种更简洁的方式写出基于Promise的异步行为,而无需刻意地链式调用promise。
- Async/await这两个关键字是成对存在的,只有在用 async 声明的function,其内部才能使用 await
- await是等待的意思,后面接收一个promise,他会一直等待promise的数据(实参)返回,然后将promise中的数据(实参)提取出来,供后面的代码处理,在此过程中,await后面的代码不会执行,处于等待状态
async function getGameList(){
try{
console.log('开始请求',new Date().getTime())
const result = await axios.get('/game_list.json')
console.log('数据已经回来',new Date().getTime())
}catch(err){
console.log(err)
}
}

4.并发
- 通过Promise.all([promise,promise2])发起并发请求,待所有请求都回来后统一处理
<script>
new Vue({
el:"#app",
data: {
},
created(){
this.getAllData()
},
methods: {
getAllData(){
Promise.all([this.getData(), this.getData2()])
.then(function(resArr){
console.log('res1',resArr[0].data)
console.log('res2',resArr[1].data)
})
},
getData(){
return axios.get('http://127.0.0.1:8086/getDouble?val=5')
},
getData2(){
return axios.get('http://127.0.0.1:8086/getTriple?val=10')
}
}
})
</script>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了