Promise是解決異步的一種方案胡陪,可以更優(yōu)雅的解決多個請求回調的問題,提高代碼可讀性。有 async/await 和 axios 現(xiàn)在基本用不到 Promise往声。(axios 擁有 Promsie 相同的 API)
1.提高可讀性,看上去舒服一點。
function request(url,successFun, errorFun) {
$.ajax({
type: 'GET',
url:url,
param: {},
success: successFun,
error: errorFun
});
}
request('url1',(res)=>{ console.log("成功后做一些什么")},(err)=>{console.log("失敗了做一些事") })
//使用 Promise
function requestPromise (url) {
return new Promise((resolve, reject)=> {
$.ajax({
type: 'GET',
url: url,
param: {},
success: res => { resolve(res ) },
error: err => { reject(err) }
});
});
}
requestPromise('url1').then((res) => { console.log("成功后做一些什么") }).catch((err) => {console.log("失敗了做一些事")})
鏈式編程的意思戳吝, .then調用多個請求(都是Promise實例)
requestPromise('url1').then((res) => {
console.log("成功后我再走 url2 接口")
return requestPromise('url2')
}).then((res) => {
console.log("成功后我再走 url3 接口")
return requestPromise('url3')
}).catch(err => { console.log("報錯觸發(fā)浩销,后面都不在執(zhí)行") })
2.Pomise.all()
Promise.all可以將多個Promise實例包裝成一個新的Promise實例。同時听哭,成功和失敗的返回值是不同的慢洋,成功的時候返回的是一個結果數(shù)組(順序和Promise實例參數(shù)順序一致),而失敗的時候則返回最先被reject失敗狀態(tài)的值陆盘。
let p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('我是p1')
},1000)
})
let p2 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('我是p2')
}, 500)
})
Promise.all([p1, p2]).then((result) => {
console.log(result) //['我是p1', '我是p2']
}).catch((error) => {
console.log(error)
})
3.Promise.race()
傳參和 all()一樣普筹,不同的是無論 resolve 還是 reject 只返回第一個有結果的值,race -- 比賽隘马。
4.Promise.resolve()
將一個包含請求的對象轉為 Promise 對象太防。或者你想使用 .then() 做后續(xù)操作酸员。
在主線程任務執(zhí)行完之后立馬執(zhí)行 Promise.resolve 的 .then ,最后執(zhí)行其他異步任務蜒车。可以用來優(yōu)化一些視圖更新幔嗦。
Promise.resolve(data ? data : getDataFn()).then()
5.Promise.reject()
也是可以將一個對象轉為 Promise 對象酿愧,拋出錯誤。暫時沒發(fā)現(xiàn)有什么用邀泉。嬉挡。钝鸽。
6.其他
Promise.resolve 比 new Promise 快。
Promise 的API都是微任務棘伴。
最好使用 .then() 操作回調寞埠。