vocus logo

方格子 vocus

EP 03 | Asynchronous JS 的運用 - Callback Functions Hell

更新 發佈閱讀 7 分鐘

在了解 Callback Functions Hell ,必須先知道甚麼是 Callback Functions ,而 Callback Functions 怎麼造成 Callback Functions Hell。

Callback Functions

其實有寫過 JS 的 都應該有用過 Callback Functions(以下簡稱 Callback ),像是常用的 forEach() 、 map()filter()setTimeout() 等等。

什麼是 Callback ?

範例一

let arr = [1, 2, 3]

arr.forEach(a => a % 2 != 0)

又或者是

範例二

function getMsg(){

console.log('Hello Ajax')

}



function getResponse(cb){

let xhr = new XMLHttpRequest()

xhr.open('GET', 'https://jsonplaceholder.typicode.com/todos/1')

xhr.send()



xhr.addEventListener('readystatechange', (e)=>{

if(xhr.readyState === 4){

if(xhr.status >= 200 && xhr < 300){

cb()

}

}

})

}



getResponse(getMsg)

在 freeCodeCamp 中 What is a Callback Function in JavaScript? 寫到:

A callback function is a function that is passed as an argument to another function, to be “called back” at a later time. A function that accepts other functions as arguments is called a higher-order function.

簡單來說 Callback Function 指的就是做為另一個函數(以下稱函數 A )的引數,並且這個引數在函數 A 中會被調用,而這個接收其他函數作為引數的函數 A 又可以稱做 Higher-Order Function(高階函數)。

所以上面那 2 個 JS 範例, 範例一中 forEach() 帶入的 a => a % 2 != 0 及範例二中 getResponse() 帶入的 getMsg 都是 Callback Function 。

Callback Functions 怎麼變成 Callback Functions Hell 的?

假使透過異步函數得到資料後,要在執行另一個異步函數去取得另一個資料的話,以 Callback Functions 來寫的話會是怎樣?

function getResponse(url, cb){

let xhr = new XMLHttpRequest()

xhr.open('GET', url)

xhr.send()



xhr.addEventListener('readystatechange', (e)=>{

if(xhr.readyState === 4){

if(xhr.status >= 200 && xhr.status < 300){

cb(undefined, JSON.parse(xhr.responseText))

}

else{

cb('cann\'t fetch!', undefined)

}

}

})

}



getResponse('https://jsonplaceholder.typicode.com/todos/1', (err, data) => {

console.log(err, data)

// 取得 todos/1 資料後,再去調用 getResponse() 取得另一筆 todos/3 的資料

getResponse('https://jsonplaceholder.typicode.com/todos/3', (err, data) => {

console.log(err, data)

})

})

而 Callback Functions Hell 的形成就是因為太多的 Callback Functions 被一層一層執行下去,導致代碼難以維護。

getResponse('https://jsonplaceholder.typicode.com/todos/1', (err, data) => {

console.log(err, data)

getResponse('https://jsonplaceholder.typicode.com/todos/3', (err, data) => {

console.log(err, data)

getResponse('https://jsonplaceholder.typicode.com/todos/5', (err, data) => {

console.log(err, data)

getResponse('https://jsonplaceholder.typicode.com/todos/5', (err, data) => {

console.log(err, data)

getResponse('https://jsonplaceholder.typicode.com/todos/5', (err, data) => {

console.log(err, data)

})

})

})

})

})

上面這個範例看起來是不是會覺得很雜亂,想修改也無從下手的感覺,再想想看如果在繼續不斷的在上一層中調用 Callback Function 的話,是不是會覺得很恐怖,這也是為什麼會被稱作 Callback Functions Hell 。

留言
avatar-img
鍋灶的熱湯
0會員
12內容數
分享生活、旅行經驗,經驗是種解決問題的方式,方式不只一種歡迎大家一起分享經驗
鍋灶的熱湯的其他內容
2026/02/27
先來了解一下一個專有名詞 「AJAX」(非同步 JavaScript 及 XML,Asynchronous JavaScript and XML),這個名詞主要用來描述利用 JS 中數個方法來向伺服器取得資料,且不需要更新畫面即可及時取得最新內容,而這一篇主要是介紹如何使用 XMLHttpReque
Thumbnail
2026/02/27
先來了解一下一個專有名詞 「AJAX」(非同步 JavaScript 及 XML,Asynchronous JavaScript and XML),這個名詞主要用來描述利用 JS 中數個方法來向伺服器取得資料,且不需要更新畫面即可及時取得最新內容,而這一篇主要是介紹如何使用 XMLHttpReque
Thumbnail
2026/02/26
一直以來都不是很了解 promise 、 fetch 、 async await 等等的區別及運用,所以特地用這一系列的筆記加深自己的印象。 Synchronous JavaScript(同步 JS )的概念 JavaScript 是 single threaded (單執行緒 / 單線程),
2026/02/26
一直以來都不是很了解 promise 、 fetch 、 async await 等等的區別及運用,所以特地用這一系列的筆記加深自己的印象。 Synchronous JavaScript(同步 JS )的概念 JavaScript 是 single threaded (單執行緒 / 單線程),
2026/02/24
border有哪些屬性? 設計border樣式時,常會直接寫下border :1px solid #000,但這些屬性值個代表甚麼意思? 參考w3school的介紹 The border property is a shorthand property for the following in
Thumbnail
2026/02/24
border有哪些屬性? 設計border樣式時,常會直接寫下border :1px solid #000,但這些屬性值個代表甚麼意思? 參考w3school的介紹 The border property is a shorthand property for the following in
Thumbnail
看更多
你可能也想看
Thumbnail
賽勒布倫尼科夫以流亡處境回望蘇聯電影導演帕拉贊諾夫的舞台作品,以十段寓言式殘篇,重新拼貼記憶、暴力與美學,並將審查、政治犯、戰爭陰影與「形式即政治」的劇場傳統推到台前。本文聚焦於《傳奇:帕拉贊諾夫的十段殘篇》的舞台美術、音樂與多重扮演策略,嘗試解析極權底下不可言說之事,將如何成為可被觀看的公共發聲。
Thumbnail
賽勒布倫尼科夫以流亡處境回望蘇聯電影導演帕拉贊諾夫的舞台作品,以十段寓言式殘篇,重新拼貼記憶、暴力與美學,並將審查、政治犯、戰爭陰影與「形式即政治」的劇場傳統推到台前。本文聚焦於《傳奇:帕拉贊諾夫的十段殘篇》的舞台美術、音樂與多重扮演策略,嘗試解析極權底下不可言說之事,將如何成為可被觀看的公共發聲。
Thumbnail
柏林劇團在 2026 北藝嚴選,再次帶來由布萊希特改編的經典劇目《三便士歌劇》(The Threepenny Opera),導演巴里・柯斯基以舞台結構與舞台調度,重新向「疏離」進行提問。本文將從觀眾慾望作為戲劇內核,藉由沉浸與疏離的辯證,解析此作如何再次照見觀眾自身的位置。
Thumbnail
柏林劇團在 2026 北藝嚴選,再次帶來由布萊希特改編的經典劇目《三便士歌劇》(The Threepenny Opera),導演巴里・柯斯基以舞台結構與舞台調度,重新向「疏離」進行提問。本文將從觀眾慾望作為戲劇內核,藉由沉浸與疏離的辯證,解析此作如何再次照見觀眾自身的位置。
Thumbnail
本文深入解析臺灣劇團「晃晃跨幅町」對易卜生經典劇作《海妲.蓋柏樂》的詮釋,從劇本歷史、聲響與舞臺設計,到演員的主體創作方法,探討此版本如何讓經典劇作在當代劇場語境下煥發新生,滿足現代觀眾的觀看慾望。
Thumbnail
本文深入解析臺灣劇團「晃晃跨幅町」對易卜生經典劇作《海妲.蓋柏樂》的詮釋,從劇本歷史、聲響與舞臺設計,到演員的主體創作方法,探討此版本如何讓經典劇作在當代劇場語境下煥發新生,滿足現代觀眾的觀看慾望。
Thumbnail
《轉轉生》為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,融合舞蹈、音樂、時尚和視覺藝術,透過身體、服裝與群舞結構,回應殖民歷史、城市經驗與祖靈記憶的交錯。本文將從服裝設計、身體語彙與「輪迴」的「誕生—死亡—重生」結構出發,分析《轉轉生》如何以當代目光,形塑去殖民視角的奈及利亞歷史。
Thumbnail
《轉轉生》為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,融合舞蹈、音樂、時尚和視覺藝術,透過身體、服裝與群舞結構,回應殖民歷史、城市經驗與祖靈記憶的交錯。本文將從服裝設計、身體語彙與「輪迴」的「誕生—死亡—重生」結構出發,分析《轉轉生》如何以當代目光,形塑去殖民視角的奈及利亞歷史。
Thumbnail
Double girder gantry cranes are widely used in heavy industries, manufacturing plants, shipyards, and logistics hubs, thanks to their high lifting cap
Thumbnail
Double girder gantry cranes are widely used in heavy industries, manufacturing plants, shipyards, and logistics hubs, thanks to their high lifting cap
Thumbnail
在垃圾債券的實戰中,馬克斯逐漸發展出獨特的思考模式。當所有人都說某支債券"太危險"時,他問的是"這個風險有沒有被充分定價?"當市場一致看好時,他思考的是"還有誰沒買進?"這種思維方式讓他在同業眼中顯得奇怪,但卻帶來了超額報酬。第二層思維不是為了與眾不同而不同,而是要比別人想得更深、更全面。
Thumbnail
在垃圾債券的實戰中,馬克斯逐漸發展出獨特的思考模式。當所有人都說某支債券"太危險"時,他問的是"這個風險有沒有被充分定價?"當市場一致看好時,他思考的是"還有誰沒買進?"這種思維方式讓他在同業眼中顯得奇怪,但卻帶來了超額報酬。第二層思維不是為了與眾不同而不同,而是要比別人想得更深、更全面。
Thumbnail
sync rst 和 async rst reg 在rtl上只有差在always block的condition不同,但是在合成上卻是兩種不同type的register,有著不同的優缺 sync reset reg : always @ (postedge clk) begin if (!rs
Thumbnail
sync rst 和 async rst reg 在rtl上只有差在always block的condition不同,但是在合成上卻是兩種不同type的register,有著不同的優缺 sync reset reg : always @ (postedge clk) begin if (!rs
Thumbnail
在這個高壓的社會中,我們無法遠離壓力,但我們可以學會擁抱與接納壓力,並適度地減輕壓力帶來的焦慮。讓我們一起過上慢悠舒壓的生活,一起成長。
Thumbnail
在這個高壓的社會中,我們無法遠離壓力,但我們可以學會擁抱與接納壓力,並適度地減輕壓力帶來的焦慮。讓我們一起過上慢悠舒壓的生活,一起成長。
Thumbnail
非同步程式設計(Asynchronous programming) 或是簡單的稱之為 async,它是一種並發程式模型(concurrent programming model),其目的就是讓多個任務能同時在作業系統的執行緒上執行,並透過 async/.await 保留同步。
Thumbnail
非同步程式設計(Asynchronous programming) 或是簡單的稱之為 async,它是一種並發程式模型(concurrent programming model),其目的就是讓多個任務能同時在作業系統的執行緒上執行,並透過 async/.await 保留同步。
Thumbnail
今日空檔時間,意外發現怎麼這個月的預算,默默又透支了😅 瞬間覺得焦慮了起來!程度來到了一旦去面對現實,便覺有點想吐的狀態⋯⋯。 午休時間,反正也睡不著,因此想了想: 我的靈魂會選擇我這個人的人生,應該不是要過這樣子的生活,不是要過這樣既糾結人生成功與否及羨慕嫉妒他人成就的這種生活吧!
Thumbnail
今日空檔時間,意外發現怎麼這個月的預算,默默又透支了😅 瞬間覺得焦慮了起來!程度來到了一旦去面對現實,便覺有點想吐的狀態⋯⋯。 午休時間,反正也睡不著,因此想了想: 我的靈魂會選擇我這個人的人生,應該不是要過這樣子的生活,不是要過這樣既糾結人生成功與否及羨慕嫉妒他人成就的這種生活吧!
Thumbnail
一切的正能量 原始於相信自我的力量 時常給予自己肯定句的暗示 並時刻懷抱感恩的心 漸漸會發現 這個世界也是有許多可愛的一面 常聽人說:「心境決定情境」 當心情好了,逆境自然也就解了 以前的我不以為意 但現在的我信奉為圭臬
Thumbnail
一切的正能量 原始於相信自我的力量 時常給予自己肯定句的暗示 並時刻懷抱感恩的心 漸漸會發現 這個世界也是有許多可愛的一面 常聽人說:「心境決定情境」 當心情好了,逆境自然也就解了 以前的我不以為意 但現在的我信奉為圭臬
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News