Promise是ES6裏新增的語法,一種異步編程的解決方案,比傳統的解決方案回調函數和事件更加合理和強大,Promise有三種狀態,分別是Pending(進行中),Fulfilled(已成功),Rejected(已失敗),狀態一旦發生變化就不能再發生改變,只能從一種狀態變為另一種,例如:Pending -> Fulfilled,Pending -> Rejected。Promise構造函數接收一個函數,這個函數有兩個固定的參數,分別是resolve和reject,這兩個參數也是一個函數,我們通過調用resolve函數會使狀態從Pending變為Fulfilled,將會執行then裏面的第一個回調函數參數,調用reject函數的話會使狀態從Pending變為Rejected,將會執行then裏面的第二個回調函數參數,假如then裏面只傳了一個參數的話,我們也可以通過catch來進行回調。
new Promise((resolve, reject) => {
setTimeout(() => {
resolve("請求成功"); // 執行then裏面的第一個回調函數
//reject("error message"); // 執行then裏面的第二個回調函數或執行catch裏面的回調函數
}, 1000);
}).then(res => {
console.log(res)
}, err => {
console.log(err)
}).catch(err=>{
console.log(err)
})
Promise.all可以將多個Promise實例包裝成一個新的Promise實例,這些Promise以數組的形式作為Promise.all的參數,要每個Promise都成功才會執行Promise.all的then的第一個參數函數回調,將這些Promise成功返回的結果以數組形式返回,只要有一個失敗都會進行reject操作,返回的結果為第一個失敗的Promise的結果。
Promise.all([
new Promise((resolve, reject) => {
setTimeout(() => {
resolve({
name: 'why',
age: 18
})
}, 2000);
}),
new Promise((resolve, reject) => {
setTimeout(() => {
resolve({
name: 'kobe',
age: 19
})
}, 1000);
})
]).then(results => {
console.log(results);
}).catch(err=>{
console.log(err)
})
Promise.race也是可以將多個Promise實例包裝成一個新的Promise實例,同樣的這些Promise以數組的形式作為Promise.race的參數,這些Promise實例哪個先發生狀態改變就先返回哪個的結果,無論是進行了resolve操作還是reject操作,相當於是賽跑。
Promise.race([
new Promise((resolve, reject) => {
setTimeout(() => {
resolve('請求成功')
}, 1000);
}),
new Promise((resolve, reject) => {//第二個promise返回結果更快
setTimeout(() => {
resolve('請求失敗')
}, 500);
})
]).then(results => {
console.log(results);
}).catch(err => {
console.log(err);//最終調用了catch
})