天天看點

Vue.js 學習筆記十四:Promise 之介紹和基本用法

目錄

什麼是 Promise

Promise 的基本用法

JavaScript 的執行環境是單線程。

所謂單線程,是指 JS 引擎中負責解釋和執行 JavaScript 代碼的線程隻有一個,也就是一次隻能完成一項任務,這個任務執行完後才能執行下一個,它會「阻塞」其他任務。這個任務可稱為主線程。

異步模式可以一起執行多個任務。

常見的異步模式有以下幾種:

  • 定時器
  • 接口調用
  • 事件函數

js 中常見的接口調用方式,有以下幾種:

  • 原生 ajax
  • 基于 jQuery 的 ajax
  • Fetch
  • Promise
  • axios

多次異步調用的依賴分析

  • 多次異步調用的結果,順序可能不同步。
  • 異步調用的結果如果存在依賴,則需要嵌套。

在 ES5 中,當進行多層嵌套回調時,會導緻代碼層次過多,很難進行維護和二次開發。而且會導緻回調地獄的問題。ES6 中的 Promise 就可以解決這兩個問題。

什麼是 Promise

ES6 中的 Promise 是異步程式設計的一種方案。從文法上講,Promise 是一個對象,它可以擷取異步操作的消息。

Promise 對象, 可以将異步操作以同步的流程表達出來。

使用 Promise 主要有以下好處:

  • 可以很好地解決回調地獄的問題(避免了層層嵌套的回調函數)。
  • 文法非常簡潔。Promise 對象提供了簡潔的 API,使得控制異步操作更加容易。

回調地獄的舉例

假設買菜、做飯、吃飯都是異步的。

但真實的場景中,實際的操作流程是:買菜成功之後,才能開始做飯。做飯成功後,才能開始吃飯。這裡面就涉及到了多層嵌套調用,也就是回調地獄。

Promise 的基本用法

使用

new

執行個體化一個 Promise 對象,Promise 的構造函數中傳遞一個參數。這個參數是一個函數,該函數用于處理異步任務。

并且傳入兩個參數:

resolve

reject

,分别表示異步執行成功後的回調函數和異步執行失敗後的回調函數。

通過

promise.then()

處理傳回結果。這裡的

promise

指的是 Promise 執行個體。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>Promise 的基本用法</title>
	</head>
	<body>
		<script type="text/javascript">
			
			const runAsync = () => {
				// 第一步:model層的接口封裝
				let promise = new Promise((resolve, reject) => {								
					// 這裡做異步任務(比如 ajax 請求接口,這裡暫時用定時器代替)
					setTimeout(() => {
						 // 接口傳回的資料
						const data = { code: 200, msg:'hello world' }
						if (data.code === 200) {
							// 接口請求成功時調用
							resolve(data)
						} else {
							// 接口請求失敗時調用
							reject({ code: 500, msg: 'network error' })
						}					
					}, 1000)
				})
				// 第二步:業務層的接口調用。這裡的 res 就是 從 resolve 和 reject 傳過來的,也就是從接口拿到的資料
				.then(res => {
					// 從 resolve 擷取正常結果
					console.log(res)
				})
				.catch(res => {
					// 從 reject 擷取異常結果
					console.log(res)									
				})
				return promise
			}	
            runAsync()
		</script>
	</body>
</html>
           

上方代碼中,當從接口傳回的資料

data.code

的值不同時,可能會走 resolve,也可能會走 reject,這個由你自己的業務決定。