JavaScript 中Promise的使用和 Async的使用

Promise

由CommonJS社区提出,在ES2015中被标准化,成为语言js规范

解决回调函数嵌套问题,更好的实现异步编程,使代码扁平化

基本用法

Promise 构造函数只有一个参数,是一个函数,构造之后函数会直接被异步放到线程最后运行,所以我们称之为起始函数。异步函数执行结束后包含两个状态回调,成功执行resolve(data)回调,失败 reject(error)

function ajax(url,data){
    return new Promise((resolve,reject)=>{
        let xmlhttp = new XMLHttpRequest();
	    xmlhttp.onreadystatechange = function()
	    {
		    if (xmlhttp.readyState==4 && xmlhttp.status==200)
		    {
			    resolve(xmlhttp.responseText)
		    }else{
                reject('出错')
            }
	    }
	    xmlhttp.open("GET",url + "?id=" + data.id,true);
	    xmlhttp.send();
    })
}
ajax('/user').then(res=>{
    console.log(res)
})
.catch(err=>{
    console.error(err)
})

链式调用

串联执行异步调用,用来避免回调嵌套

ajax('/user')
.then(val=>{
    return ajax('/list',{id:val.id})
})
.then(val=>{
    console.log(val)
})
.catch(err=>{
    console.log(err)
})

并行处理

Promise.all()所有任务结束后返回

Promise.race()第一个任务结束后返回

ajax('/user')
.then(val=>{
    return ajax('/list',{id:val.id})
})
.then(val=>{
    console.log(val)
})
.catch(err=>{
    console.log(err)
})

let p = Promise.all([
    ajax('/menu'),
    ajax('/user')
])

//所有请求完成后执行
p.then(res=>{//都成功后才会执行
    console.log(res) //res是个数组保存了每个promise对象的结果
})
.catch(err=>{//有一个失败就执行
    console.log(err)
})

let timeout = new Promise((resolve,reject)=>{
    setTimeout(()=>reject('超时'),500)
})
let pRace = Promise.race([
    ajax('/menu'),
    timeout 
])
//第一个任务结束后返回
p.then(res=>{//只返回第一个完成任务的处理结果
    console.log(res) 
})
.catch(err=>{
    console.log(err)
})

Async

async是ES7 中的关键字

async函数返回一个Promise对象

await 操作符用于等待一个 Promise 对象, async function 内部才可以使用,后面也可跟其他值只是会立即返回

async function testAsync(){
    
    let a1 = await ajax('/menu')
    console.log(a1)
    let a2 = ajax('/user')
    console.log(a2)
    let a3 = await '我是第二个'
    console.log(a3)
}

testAsync()

//返回a1执行结果
//返回a3 '我是第二个'
//返回a2执行结果

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuhang139

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值