通俗易懂 ES6 Promise
在ES6中,Promise是一個構造函數,創建Promise時,需要提供一個函數做為參數,這個函數就是非同步運行時的代碼,我們可以使用setTimeout
來虛擬一下非同步:
// Promise 構造函數
new Promise(function(){
window.setTimeout(function makeCoffee(){
const coffee = {};
// 燒水
// 把咖啡粉放入濾紙
// 手沖咖啡
// 完成
},Math.random() * 2000)
})
當Promise執行時,會在幾秒後執行makeCoffee
函數
確定成功請求或者失敗請求的狀態
我們需要知道什麼時候完成了咖啡的製作,或者沒有完成,需要傳入兩個函數來實現,成功狀態下調用 resolve
和失敗狀態調用 reject
// Promise 構造函數
new Promise(function(){
window.setTimeout(function makeCoffee(){
const coffee = {};
// 燒水
// 把咖啡粉放入濾紙
// 手沖咖啡
// 完成
resolve(coffee);
},Math.random() * 2000)
})
當coffee
完成後,會調用resolve
方法並向其傳遞我們要返回的數據coffee
,如果請求出現問題,無法完成,調用reject
:
// Promise 構造函數
new Promise(function(){
window.setTimeout(function makeCoffee(){
const coffee = {};
// 燒水
// 把咖啡粉放入濾紙
// 手沖咖啡
if (/* 未完成 */ ){
reject(sorry, today no coffee!)
}
resolve(coffee);
},Math.random() * 2000)
})
Promise 立即返回對象
Promise 被調用時,立即返回一個對象
const myCoffee = new Promise(function(resolve, reject){
// make coffee
})
該對象具有一個.then()
方法,接收兩個函數:
- 請求成功完成時要運行的函數
- 請求失敗時要運行的函數
myCoffee.then(function(coffee){
console.log(`Hello ${coffee}`)
}, funciton(msg){
console.log(msg)
})
Promise
中傳入resolve
和reject
的數據,在.then()
調用函數傳入的數據是同一個數據。
推薦閱讀: