iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 22
1
Modern Web

和少女工程師一起學 JavaScript 系列 第 22

和少女工程師一起學 JavaScript Day22 Promise

  • 分享至 

  • xImage
  •  

Promise 介紹

  • 異步執行的控制流程架構
  • 把多個異步執行的函式的執行流程轉成為一個一個執行(序列執行),或是等全部處理完再說(並行執行)
  • 前端使用時機:AJAX、DOM事件處理、動畫流程處理(計時器)

建立 Promise 函式

function asyncFunction(value){  //通常會包在函式中
	new Promise(function(resolve, reject){
		resolve(value)   //成功時
		reject(reason)   //失敗時
	})
}

promise.then(function(value){
		//成功時
},function(reason){
	  //失敗時
})

//ES6
new Promise((resolve, reject) => {...})

//resolve:成功
//reject:失敗

//then:接收成功的訊息
//catch:接收失敗的訊息

範例說明

var promise = function(person, time, success){
	return new Promise(function(resolve, reject){
		if(success){
			resolve(person + '抵達終點')
		}else{
			reject(new Error(person + '失敗'))
		}
	})
}

promise('小明', 2000, true).then(function(response){
	console.log(response)
		//小明抵達終點
}).catch(function(response){
		console.log(response)
		//因為是true不會有任何訊息
		//改成false之後會變成小明失敗
})
//加入非同步setTimeout(才能看出Promise的功用)
//沒使用Promise的話setTimeout的函式就會是最後一個被執行的

var promise = function(person, time, success){
	return new Promise(function(resolve, reject){
		if(success){
			setTimeout(function(){
				resolve(person + (time/1000) + '秒抵達終點')
			},time);
		}else{
			reject(new Error(person + '失敗'))
		}
	})
}

promise('小明', 2000, true).then(function(response){
	console.log(response)
	return promise('胖虎', 3000, true);
}).then(function(response){
	console.log(response)
}).catch(function(response){
		console.log(response)
})

//小明2秒抵達終點=>胖虎3秒抵達終點

Promise.all

  • Promise.all可以同時去執行好幾個promise函式(並行運算)
  • 所有的陣列傳入參數的Promise物件都要解決才進行下一步
Promise.all()

//裡面常放的是陣列[]
//也可放String、TypedArray、Map、Set
var promise = function(person, time, success){
	return new Promise(function(resolve, reject){
		if(success){
			setTimeout(function(){
				resolve(person + (time/1000) + '秒抵達終點')
			},time);
		}else{
			reject(new Error(person + '失敗'))
		}
	})
}

Promise.all([promise('小明', 2000, true), promise('胖虎', 3000, true)])
	.then(function(response){
		console.log(response)
	}).catch(function(err){
		console.log(err)
	})

//["小明2秒抵達終點", "胖虎3秒抵達終點"]

Promise.race

  • 任一個陣列傳入參數的Promise物件有解決,就會到下一步去
Promise.race()

//裡面常放的是陣列[]
//也可放String、TypedArray、Map、Set
var promise = function(person, time, success){
	return new Promise(function(resolve, reject){
		if(success){
			setTimeout(function(){
				resolve(person + (time/1000) + '秒抵達終點')
			},time);
		}else{
			reject(new Error(person + '失敗'))
		}
	})
}

Promise.race([promise('小明', 2000, true), promise('胖虎', 3000, true)])
	.then(function(response){
		console.log(response)
	}).catch(function(err){
		console.log(err)
	})

//小明2秒抵達終點

//=>只會回傳速度比較快的那個

上一篇
和少女工程師一起學 JavaScript Day21 同步&非同步
下一篇
和少女工程師一起學 JavaScript Day23 XHR
系列文
和少女工程師一起學 JavaScript 27
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言