很多成熟的編程語言都有關(guān)于并發(fā)的API,JavaScript只有一個線程脊岳,如果沒有并發(fā)操作會直接卡死逝段,為了達到無阻塞高并發(fā)js誕生很多方法垛玻,開發(fā)中實現(xiàn)異步使用最多的就是回調(diào)函數(shù)。
在日常界面開發(fā)過程奶躯,為咯防止卡頓用戶等待帚桩,一般都會使用異步操作。但是也會遇到以下這種情況:
根據(jù)界面組件需求需要多個異步操作嘹黔,而且這些異步操作有依賴關(guān)系账嚎,解決這種情況最簡單的方式就是回調(diào)函數(shù)的嵌套。這種方式能夠解決問題儡蔓,但是代碼結(jié)構(gòu)混亂郭蕉,難以維護。
NodeJS作為JavaScript的后臺編程語言必須具備成熟無阻塞高并發(fā)的功能才能處理復(fù)雜的業(yè)務(wù)邏輯喂江。目前實現(xiàn)異步有以下5種:
- 回調(diào)函數(shù)
- 事件監(jiān)聽
- 發(fā)布/訂閱
- Promise對象
- async函數(shù)
在圖形化編程工具Scratch二次開發(fā)的過程中需要將異步操作隊列化召锈。在這個過程中使用到咯Promise對象,對于Promise有了更深的理解获询。
Promise對象
Promise對象用來傳遞異步操作的消息涨岁,它代表了某個未來才會知道結(jié)果的事件(異步操作)。并且這個事件提供統(tǒng)一的API吉嚣,可供進一步處理梢薪。
Scratch自定義積木塊
使用圖形化編程工具,每個積木塊具有特定功能瓦戚,多個積木塊堆積沮尿,按照順序逐步執(zhí)行,在單個積木塊中實現(xiàn)功能時大概率會使用異步函數(shù)较解,比如調(diào)用后臺數(shù)據(jù)接口畜疾,比如需要等待用戶操作。
如果我們定義咯一個音視頻輸入的積木塊印衔,首先音視頻屬于需要異步處理啡捶,處理結(jié)果和后臺數(shù)據(jù)交互也需要異步處理,這個時候就復(fù)現(xiàn)咯剛才提到的異步操作的依賴關(guān)系奸焙。那么Promise就派上用場啦瞎暑。
基于Promise的基本語法可以將異步操作隊列化,按照期望的順序執(zhí)行与帆,返回符合預(yù)期的結(jié)果
Promise創(chuàng)建時不一定知道的值的代理了赌。它允許您將處理程序與異步操作的最終成功值或失敗原因相關(guān)聯(lián)。這使異步方法可以像同步方法一樣返回值:異步方法返回立即提供最終值的承諾玄糟,而不是立即返回最終值勿她。
A Promise處于以下狀態(tài)之一:
- 待定:初始狀態(tài),既未實現(xiàn)也不被拒絕阵翎。
- 完成:表示操作成功完成逢并。
- 拒絕:表示操作失敗之剧。
未完成的承諾可以通過值來實現(xiàn),也可以通過原因(錯誤)來拒絕砍聊。當(dāng)這些選項中的任何一個發(fā)生時背稼,將被諾言then方法排隊的相關(guān)處理程序被調(diào)用。(如果附加了相應(yīng)的處理程序時玻蝌,諾言已經(jīng)實現(xiàn)或被拒絕蟹肘,則將調(diào)用該處理程序,因此在異步操作完成和其處理程序之間沒有競爭條件俯树。
promise.then(), promise.catch()將這些狀態(tài)連接起來疆前。
這些方法promise.then(), promise.catch(), and promise.finally()用于將進一步的操作與已兌現(xiàn)的承諾相關(guān)聯(lián)。這些方法還返回一個新生成的Promise對象聘萨,該對象可以有選擇地用于鏈接