名詞約定
一般來講,有以下的名詞約定:
promise(首字母小寫)對象指的是“Promise實例對象”
Promise首字母大寫且單數(shù)形式,表示“Promise構(gòu)造函數(shù)”
Promises首字母大寫且復(fù)數(shù)形式,用于指代“Promises規(guī)范”
那么我們來扯一會
去年6月份, ES2015正式發(fā)布(也就是ES6,ES6是它的乳名),其中Promise被列為正式規(guī)范。作為ES6中最重要的特性之一,我們有必要掌握并理解透徹。本文將由淺到深,講解Promise的基本概念與使用方法。
promise是什么?
1、主要用于異步計算
2、可以將異步操作隊列化,按照期望的順序執(zhí)行,返回符合預(yù)期的結(jié)果
3、可以在對象之間傳遞和操作promise,幫助我們處理隊列
為什么會有promise?
同步:假設(shè)你去了一家飯店,找個位置,叫來服務(wù)員,這個時候服務(wù)員對你說,對不起我是“同步”服務(wù)員,我要服務(wù)完這張桌子才能招呼你。那桌客人明明已經(jīng)吃上了,你只是想要個菜單,這么小的動作,服務(wù)員卻要你等到別人的一個大動作完成之后,才能再來招呼你,這個便是同步的問題:也就是“順序交付的工作1234,必須按照1234的順序完成”。
異步:則是將耗時很長的A交付的工作交給系統(tǒng)之后,就去繼續(xù)做B交付的工作,。等到系統(tǒng)完成了前面的工作之后,再通過回調(diào)或者事件,繼續(xù)做A剩下的工作。
AB工作的完成順序,和交付他們的時間順序無關(guān),所以叫“異步”。
new
Promise(
function(resolve, reject){
// 一段耗時的異步操作
resolve('成功')// 數(shù)據(jù)處理完成
// reject('失敗') // 數(shù)據(jù)處理出錯
}
).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是我們調(diào)用的順序 ["p3完成","p2完成","p1完成"]是我們返回的結(jié)果
//可以看得出來,我們控制了3個異步請求的返回順序
})
總結(jié) :promise.all的使用場景就是可以同時處理多個異步請求并控制他們返回【結(jié)果的順序】
注意:promise.all中的任何一個請求,都將不會有返回結(jié)果
.then()
1、接收兩個函數(shù)作為參數(shù),分別代表fulfilled(成功)和rejected(失?。?br>
2、.then()返回一個新的Promise實例,所以它可以鏈?zhǔn)秸{(diào)用
3、當(dāng)前面的Promise狀態(tài)改變時,.then()根據(jù)其最終狀態(tài),選擇特定的狀態(tài)響應(yīng)函數(shù)執(zhí)行
4、狀態(tài)響應(yīng)函數(shù)可以返回新的promise,或其他值,不返回值也可以我們可以認(rèn)為它返回了一個null;
5、如果返回新的promise,那么下一級.then()會在新的promise狀態(tài)改變之后執(zhí)行
6、如果返回其他任何值,則會立即執(zhí)行下一級.then()
.then()里面有.then()的情況
1、因為.then()返回的還是Promise實例
2、會等里面的then()執(zhí)行完,再執(zhí)行外面的
promise結(jié)合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進(jìn)行異步操作
解決問題:1.回調(diào)多域問題2.多個并發(fā)請求