現在的Web應用已經不再是單純的靜態網頁,它們可以與用戶交互、訪問網絡、操作數據等等。而所有這些都需要處理io操作,這就會占據很多時間,而你的代碼需要等待這些操作完成才能繼續執行下去,這就導致了阻塞(blocking)。 近年來,隨著Web應用的復雜度增加,異步編程也成為了一個重要的主題。在這篇文章中,我們將會深入探討 javascript 2017 年異步編程的相關內容。
在 javascript 中,異步編程一般使用回調(callback) 和 Promise 兩種方式來完成。回調(callback) 是最常用的異步編程方式之一。 回調(callback) 函數就是在別的地方調用的函數,它是當某個事件發生或者當一個任務完成時被異步調用的函數,它的作用是在異步操作完成后執行某個操作。常見的例子包括在Node.js中處理HTTP請求,以及瀏覽器中的一些事件處理。
function readFile(filePath, callback) { fs.readFile(filePath, function(err, data) { if (err) { callback(err); } else { callback(null, data); } }); } readFile('./test.txt', function(err, data) { if (err) { console.error('Error:', err); } else { console.log('Data:', data.toString()); } });
Promise 是一種現代的異步編程模型。Promise 是一個包含 resolve 和 reject 函數的對象,代表了某個操作(通常是一個異步操作)的完成。Promises 的主要優點是可以很好的處理異步代碼中的回調地獄(callback hell),更加清晰明了。Promise 的主要思想是,將異步操作放到 Pending(等待中),在異步操作完成后,再根據結果轉移到 Fulfilled(已完成)或者 Rejected(已拒絕)狀態,執行不同的操作。在下面的代碼中,Promise 的第一個函數接收日志字符串,并調用 resolve,而第二個函數調用 reject。
const fetchData = () =>{ return new Promise((resolve, reject) =>{ setTimeout(() =>{ resolve('Data fetched successfully!'); }, 2000); }); } fetchData() .then((result) =>{ console.log(result); }) .catch((error) =>{ console.log(error); });
ES2017 中的 async 和 await 關鍵字讓異步代碼更加優雅。async / await 其實是語法糖,它的作用就是簡化 promise 的使用。async 表示函數是異步的,因此該函數總是返回一個 promise 對象。 await 關鍵字僅適用于 async 函數中,它告訴JavaScript引擎等待一個 promise 對象被 Resolve。下面舉個例子,其中我們通過異步調用的方式獲取了 Promise 處理的異步結果。
function fetchSpeciesWithFilms() { return fetch('https://swapi.co/api/species/') .then(response =>response.json()) .then(async ({ results }) =>{ let output = []; for (let i = 0; i< results.length; i++) { let species = results[i]; let films = []; for (let j = 0; j< species.films.length; j++) { let url = species.films[j]; let film = await fetch(url).then(response =>response.json()); films.push(film.title); } species.films = films; output.push(species); } return output; }); }
通過本篇文章的介紹,我們了解了 javascript 2017 異步編程的相關內容,包括回調(callback) 和 Promise、 async 和 await。它們各有優缺點,可以幫助你輕松地處理復雜的異步編程操作。正如我們所知道的那樣,異步編程是大勢所趨,同時也是 javascript 編程必須要掌握的一項技能。通過異步編程,你可以有效地改善 Web 應用程序的性能、訪問網絡并操作數據,因此,學習異步編程是非常重要的。