名詞約定
一般來講勉耀,有以下的名詞約定:
promise(首字母小寫)對象指的是“Promise實例對象”
Promise首字母大寫且單數形式,表示“Promise構造函數”
Promises首字母大寫且復數形式蹋偏,用于指代“Promises規(guī)范”
那么我們來扯一會
去年6月份便斥, ES2015正式發(fā)布(也就是ES6,ES6是它的乳名)威始,其中Promise被列為正式規(guī)范枢纠。作為ES6中最重要的特性之一,我們有必要掌握并理解透徹黎棠。本文將由淺到深晋渺,講解Promise的基本概念與使用方法。
promise是什么脓斩?
1木西、主要用于異步計算
2、可以將異步操作隊列化随静,按照期望的順序執(zhí)行八千,返回符合預期的結果
3、可以在對象之間傳遞和操作promise挪挤,幫助我們處理隊列
為什么會有promise叼丑?
同步:假設你去了一家飯店,找個位置扛门,叫來服務員鸠信,這個時候服務員對你說,對不起我是“同步”服務員论寨,我要服務完這張桌子才能招呼你星立。那桌客人明明已經吃上了,你只是想要個菜單葬凳,這么小的動作绰垂,服務員卻要你等到別人的一個大動作完成之后,才能再來招呼你火焰,這個便是同步的問題:也就是“順序交付的工作1234劲装,必須按照1234的順序完成”。
異步:則是將耗時很長的A交付的工作交給系統(tǒng)之后,就去繼續(xù)做B交付的工作占业,绒怨。等到系統(tǒng)完成了前面的工作之后,再通過回調或者事件谦疾,繼續(xù)做A剩下的工作南蹂。
AB工作的完成順序,和交付他們的時間順序無關念恍,所以叫“異步”六剥。
new
Promise(
function(resolve, reject){
// 一段耗時的異步操作
resolve('成功')// 數據處理完成
// reject('失敗') // 數據處理出錯
}
).then(
(res) =>{console.log(res)},// 成功
(err) =>{console.log(err)}// 失敗
)
promise.all的用法
var p1=Promise(function(resolve,reject){
setTimeout(function(){
resolve('p1完成')
},1000)
})
var p2=Promise(function(resolve,reject){
setTimeout(function(){
resolve('p1完成')
},2000)
})
var p3=Promise(function(resolve,reject){
setTimeout(function(){
resolve('p1完成')
},3000)
})
Promise.all([p3,p2,p1]).then(function(res){
console.log(res);
//p3,p2,p1是我們調用的順序 ["p3完成","p2完成","p1完成"]是我們返回的結果
//可以看得出來,我們控制了3個異步請求的返回順序
})
總結 :promise.all的使用場景就是可以同時處理多個異步請求并控制他們返回【結果的順序】
注意:promise.all中的任何一個請求峰伙,都將不會有返回結果
.then()
1疗疟、接收兩個函數作為參數,分別代表fulfilled(成功)和rejected(失斖ァ)
2秃嗜、.then()返回一個新的Promise實例,所以它可以鏈式調用
3顿膨、當前面的Promise狀態(tài)改變時,.then()根據其最終狀態(tài)叽赊,選擇特定的狀態(tài)響應函數執(zhí)行
4恋沃、狀態(tài)響應函數可以返回新的promise,或其他值必指,不返回值也可以我們可以認為它返回了一個null囊咏;
5、如果返回新的promise塔橡,那么下一級.then()會在新的promise狀態(tài)改變之后執(zhí)行
6梅割、如果返回其他任何值,則會立即執(zhí)行下一級.then()
.then()里面有.then()的情況
1葛家、因為.then()返回的還是Promise實例
2户辞、會等里面的then()執(zhí)行完,再執(zhí)行外面的
promise結合await asyan封裝接口API
var token = JSON.parse(localStorage.getItem('userInfo')).remember_token
function http(url, type, data = '') {
var p = new Promise((v, b) => {
$.ajax({
headers: {
Authorization: 'Bearer ' + token
},
url,
type,
data,
success: (res) => {
v(res)
},error:(er)=>{
b(er)
}
})
})
return p
}
function getNav(){
return http('http://***.**.**.***:**/api/menu/info','post')
}
function getList(pageNum,statues,nickname,mobile){
return http(`http://***.**.**.***:**/api/user?page=${pageNum}&limit=10&status=${statues}&nickname=${nickname}&mobile=${mobile}&`,'get')
}
如何使用癞谒?
使用場景:promise封裝api接口
Promise進行異步操作
解決問題:1.回調多域問題2.多個并發(fā)請求