媒介
看到项目里不少人用了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)
})
}
//挪用
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)
})
}