1.Promise是什么?
Promise是異步編程的一種解決方案,在ES6中Promise被列為了正式規(guī)范须妻,統(tǒng)一了用法,原生提供了Promise對(duì)象泛领。
2.Promise的基本用法
- then中成功失敗的執(zhí)行
// resolve代表成功 reject失敗 都是一個(gè)函數(shù)
let p = new Promise(function(reslove,reject){
//reslove('成功') //狀態(tài)由等待變?yōu)槌晒睦簦瑐鞯膮?shù)作為then函數(shù)中成功函數(shù)的實(shí)參
reject('失敗') //狀態(tài)由等待變?yōu)槭。瑐鞯膮?shù)作為then函數(shù)中失敗函數(shù)的實(shí)參
})
//then中有2個(gè)參數(shù)渊鞋,第一個(gè)參數(shù)是狀態(tài)變?yōu)槌晒髴?yīng)該執(zhí)行的回調(diào)函數(shù)绰更,第二個(gè)參數(shù)是狀態(tài)變?yōu)槭『髴?yīng)該執(zhí)行的回調(diào)函數(shù)。
p.then((data)=>{
console.log('成功'+data)
},(err)=>{
console.log('失敗'+err)
})
Promise承諾:默認(rèn)情況下是等待狀態(tài)pending锡宋,如果有一天狀態(tài)轉(zhuǎn)變?yōu)槌晒统晒α死芡澹绻麪顟B(tài)變成失敗就失敗了。狀態(tài)一旦改變了就不能再改變了执俩。
- 如果then中返回了一個(gè)promise 會(huì)將promise的結(jié)果繼續(xù)傳給第二then中(如果結(jié)果是將狀態(tài)改成成功就走下一個(gè)then的成功回調(diào)徐钠,狀態(tài)改為失敗就走下一個(gè)then的失敗回調(diào))
function read( content ) {
return new Promise(function( reslove,reject ) {
setTimeout(function(){
if(content>4){
resolve(content)
}else{
reject('小于4')
}
},1000)
})
}
read(1).then(( data )=>{
console.log(data)
},( err )=>{
console.log(err) //小于4
return read(2) //將狀態(tài)改為了失敗
})
.then(( data )=>{
console.log('data',data)
},( err )=>{
console.log(err) //小于4
})
- 第一個(gè)then不管是走成功還是失敗的回到函數(shù),只要返回一個(gè)普通值(不拋出錯(cuò)誤或者返回promise)役首,都會(huì)執(zhí)行下一個(gè)then的成功的回調(diào)尝丐。
let p = new Promise(function(reslove,reject){
reject('失敗1')
})
p.then((data)=>{
console.log('成功'+data)
},(err)=>{
console.log('失敗'+err) //失敗失敗1
})
.then((data)=>{
console.log('成功1'+data) //成功1undefined
},(err)=>{
console.log('失敗1'+err)
})
eg:拋出錯(cuò)誤執(zhí)行下一個(gè)then的失敗
let p = new Promise(function(reslove,reject){
reject('失敗1')
})
p.then((data)=>{
console.log('成功'+data)
},(err)=>{
console.log('失敗'+err) //失敗失敗1
})
.then((data)=>{
console.log('成功1'+data) //成功1undefined
throw Error('下一個(gè)失敗')
},(err)=>{
console.log('失敗1'+err)
})
.then((data)=>{
console.log('成功2'+data)
},(err)=>{
console.log('失敗2'+err) //失敗2Error: 下一個(gè)失敗
})
- catch的用法
catch可以實(shí)現(xiàn)錯(cuò)誤的捕獲 一般寫在最后,如果上面有自己的err會(huì)走自己的error衡奥。如果沒有寫就會(huì)走到catch
let p = new Promise(function(resolve,reject){
reject('失敗')
});
p.then((data)=>{
},(err)=>{
throw Error('錯(cuò)誤')
})
.then((data)=>{
},(err)=>{
console.log(err+'自己的err') //走自己的(輸出:Error: 錯(cuò)誤自己的err)
throw Error('錯(cuò)誤自己拋出的')
})
.then((data)=>{
//沒有自己的失敗處理函數(shù)爹袁,走catch
}).catch(e=>{
console.log(e+'公共的err') //輸出:Error: 錯(cuò)誤自己拋出的公共的err
})
- all的用法
Promise.all方法執(zhí)行后返回的依舊是promise, all兩個(gè)全成功才表示成功 。
function read(content) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve(content)
}, 1000)
})
}
let result = Promise.all([read(1), read(2)]);
result.then((data) => {
console.log(data) //[ 1, 2 ]
})
有了all矮固,就可以并行執(zhí)行多個(gè)異步操作失息,并且在一個(gè)回調(diào)中處理所有的返回?cái)?shù)據(jù)。返回的數(shù)據(jù)與傳的參數(shù)數(shù)組的順序是一樣的档址。
- race的用法
如果先成功了那就成功了, 如果先失敗了那就失敗了
function read(content) {
return new Promise(function (resolve, reject) {
setTimeout(function () {
if(content>4){
resolve(content)
}else{
reject(content)
}
}, 1000*content)
})
}
let result = Promise.all([read(5), read(2)]);
result.then((data) => {
console.log('成功'+data)
},(err)=>{
console.log('失敗'+err) //失敗2
})
- Promise的靜態(tài)方法
resolve:
Promise.resolve([1,2,3]).then(function(data){
console.log(data); //[1,2,3]
});
reject:
Promise.reject([1,2,3]).then(null,function(err){
console.log('err',err) //err [ 1, 2, 3 ]
});