在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 中傳入resolvereject的數據,在.then()調用函數傳入的數據是同一個數據。

推薦閱讀:

相关文章