異步呼叫
異步
JavaScript的執行環境是單執行緒,
所謂單執行緒,是指JS引擎中負責解釋和執行JavaScript代碼的執行緒只有一個,也就是一次只能完成一項任務,這個任務執行完后才能執行下一個,它會「阻塞」其他任務,這個任務可稱為主執行緒,
異步模式可以一起執行多個任務,
常見的異步模式有以下幾種:
-
定時器
-
介面呼叫
-
事件函式
今天這篇文章,我們重點講一下介面呼叫,介面呼叫里,重點講一下Promise,
介面呼叫的方式
js 中常見的介面呼叫方式,有以下幾種:
- 原生ajax
- 基于jQuery的ajax
- Fetch
- Promise
- axios
多次異步呼叫的依賴分析
-
多次異步呼叫的結果,順序可能不同步,
-
異步呼叫的結果如果存在依賴,則需要嵌套,
在ES5中,當進行多層嵌套回呼時,會導致代碼層次過多,很難進行維護和二次開發;而且會導致回呼地獄的問題,ES6中的Promise 就可以解決這兩個問題,
Promise 概述
Promise的介紹和優點
ES6中的Promise 是異步編程的一種方案,從語法上講,Promise 是一個物件,它可以獲取異步操作的訊息,
Promise物件, 可以將異步操作以同步的流程表達出來,使用 Promise 主要有以下好處:
-
可以很好地解決回呼地獄的問題(避免了層層嵌套的回呼函式),
-
語法非常簡潔,Promise 物件提供了簡潔的API,使得控制異步操作更加容易,
回呼地獄的舉例
假設買菜、做飯、洗碗都是異步的,
但真實的場景中,實際的操作流程是:買菜成功之后,才能開始做飯,做飯成功后,才能開始洗碗,這里面就涉及到了多層嵌套呼叫,也就是回呼地獄,
Promise 的基本用法
(1)使用new實體化一個Promise物件,Promise的建構式中傳遞一個引數,這個引數是一個函式,該函式用于處理異步任務,
(2)并且傳入兩個引數:resolve和reject,分別表示異步執行成功后的回呼函式和異步執行失敗后的回呼函式;
(3)通過 promise.then() 處理回傳結果,這里的 p 指的是 Promise實體,
代碼舉例如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
// 第一步:model層的介面封裝
const promise = new Promise((resolve, reject) => {
// 這里做異步任務(比如ajax 請求介面,這里暫時用定時器代替)
setTimeout(function() {
var data = https://www.cnblogs.com/qianguyihao/p/{ retCode: 0, msg:'qianguyihao' }; // 介面回傳的資料
if (data.retCode == 0) {
// 介面請求成功時呼叫
resolve(data);
} else {
// 介面請求失敗時呼叫
reject({ retCode: -1, msg: 'network error' });
}
}, 100);
});
// 第二步:業務層的介面呼叫,這里的 data 就是 從 resolve 和 reject 傳過來的,也就是從介面拿到的資料
promise.then(data =https://www.cnblogs.com/qianguyihao/p/> {
// 從 resolve 獲取正常結果
console.log(data);
}).catch(data => {
// 從 reject 獲取例外結果
console.log(data);
});
</script>
