寫在前面:最近刷面經,被問到很多關於ES6的問題,當提到promise時,本以爲回答的還不錯,可是之後被懟了,說我理解得有問題,鬱悶之餘回來惡補一下,才發現自己當時只回答一些皮毛,這些不是面試官想聽到的,敗軍之將,羞愧難當,寫下此文章。覆車之鑑,望後人警示。
引流阮一峯大佬的文章-->Promise 對象
面試回答:
promise就是用來解決 異步 處理的, 不管在vue 中 還是 其他的 地方, 都一樣, 一般vue 中我們會用axios來解決接口的問題, 但是如果有多個 接口A,B,C需要按照順序調的時候, 就需要在封裝axios的時候用promise , 做到 等待 前一個 接口A 完成, 再 執行B , 形成一個鏈式調用。
手寫代碼:
function fun(){
return new Promise((resolve,reject) => {
axios.post(url,data)
.then(response => {
resolve(response.data);
},err => {
reject(err)
})
})
}
const promise=new Promise((resolve,reject)=>{
axios.get(url,params)
})
promise.then(res=>{
})
promise.catch(err=>{
})
純理論:Promise 是異步編程的一種解決方案,比傳統的解決方案——回調函數和事件——更合理和更強大。它由社區最早提出和實現,ES6 將其寫進了語言標準,統一了用法,原生提供了Promise
對象。
Promise
對象代表一個異步操作,有三種狀態:pending
(進行中)、fulfilled
(已成功)和rejected
(已失敗)。
一旦狀態改變,就不會再變,任何時候都可以得到這個結果。
promise有兩個參數,成功、失敗(resolve,reject)
有了Promise
對象,就可以將異步操作以同步操作的流程表達出來,避免了層層嵌套的回調函數。此外,Promise
對象提供統一的接口,使得控制異步操作更加容易
Promise
也有一些缺點。首先,無法取消Promise
,一旦新建它就會立即執行,無法中途取消。其次,如果不設置回調函數,Promise
內部拋出的錯誤,不會反應到外部。第三,當處於pending
狀態時,無法得知目前進展到哪一個階段(剛剛開始還是即將完成)。