Javascript中Promise的四种常⽤⽅法总结
前⾔
Promise是JavaScript异步操作解决⽅案,最近看到项⽬⾥不少⼈⽤了Promise 的库类,⽐如 bluebird、q 、jQuery.Deffered 等 polyfill promise ⽅式,使⽤的时候翻看长长的⽂档,真⼼累觉不爱。
es5 发展到现在,node 在0.12版本就已经⽀持了promise,在客户端,⼤部分浏览器也⽀持了Promise,如果要兼容低版本的浏览器,可以加上es5-shim等 polyfill promise。下⾯话不多说,来⼀起看看详细的介绍:
⽤法
Promise 常⽤场景。
处理异步回调
多个异步函数同步处理
异步依赖异步回调
封装统⼀的⼊⼝办法或者错误处理
⼀、处理异步回调
Promise 的基本⽤法,处理异步回调。
function Pro1(){
return new Promise(function(resolve, reject) {
setTimeout(function(){
resolve('pro1')
}, 300)
})
}
//调⽤
Pro1()
.then(function(data){
console.log(data) //pro1
})
.catch(function(err){
throw new Error(err)
})
⼆、多个异步函数同步处理
有时候我们需要发送两个ajax,希望他们能⼀起把数据返回,就可以采⽤下⾯的办法。
function Pro1(){
return new Promise(function(resolve, reject) {
setTimeout(function(){
resolve('pro1')
}, 300)
})
}
function Pro2(){
return new Promise(function(resolve, reject) {
setTimeout(function(){
resolve('pro2')
}, 300)
})
}
javascript 函数//调⽤
var Pro = Promise.all([Pro1(), Pro2()]);
Pro
.then(function(data){
console.log(data[0], data[1]) //Pro1 Pro2
})
.catch(function(err){
throw new Error(err)
})
三、异步依赖异步回调
有些场景是⼀个异步依赖另⼀个异步的返回值的,就可以采⽤下⾯的⽤法。
⽐如:⽤⼀个订单号异步取到订单详情,再⽤订单详情⾥的商品Id获取到商品详情。
function Pro1(orderId){
return new Promise(function(resolve, reject) {
setTimeout(function(){
var orderInfo = {
orderId: orderId,
productIds: ['123', '456']
}
resolve(orderInfo.productIds)
}, 300)
})
}
function Pro2(productIds){
return new Promise(function(resolve, reject) {
setTimeout(function(){
var products = productIds.map(function(productId){
return {
productId: productId,
name: '⾐服'
}
})
resolve(products)
}, 300)
})
}
//调⽤
Pro1('abc123')
.then(function(productIds){
console.log('商品id',productIds)
return Pro2(productIds)
})
.then(function(products){
console.log('商品详情',products)
})
.catch(function(err){
throw new Error(err)
})
四、封装统⼀的⼊⼝办法或者错误处理
错误处理
function ErrorHandler(promiseObj, rejectOrResOrCallback){
return promiseObj.then(null, function(err){
if(!err)
})
}
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作能带来⼀定的帮助,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。