自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

關(guān)于 JavaScript 中的 Promise,你應(yīng)該知道的五件事

開發(fā) 前端
Promise 模式是現(xiàn)代 JavaScript 編程的必備條件。 使用 then/catch 鏈接看起來很簡單,但它有一些我們最好知道的細(xì)節(jié)。 這篇文章將帶來關(guān)于 Promise 的 5 件事。

Promise 模式是現(xiàn)代 JavaScript 編程的必備條件。 使用 then/catch 鏈接看起來很簡單,但它有一些我們最好知道的細(xì)節(jié)。 這篇文章將帶來關(guān)于 Promise 的 5 件事。

1. 反復(fù)解決

如果下面的代碼運(yùn)行會發(fā)生什么?

new Promise(resolve => {
resolve(new Promise(resolve => {
resolve(new Promise(resolve => {
resolve(10)
}))
}))
})
.then(value => console.log(value)) // 10

then() 給你 10(不是 Promise 實(shí)例)。 如果解析的值是一個 Promise,那么它會解析直到它不能 then-able。

2.返回鏈

then() 鏈不僅是函數(shù)鏈,還是價值鏈。

Promise.resolve(10)
.then(value => value + 1)
.then(value => value + 1)
.then(value => console.log(value)) // 12

第一個 then() 為該值提供 10,第二個為 11,第三個為 12。它還對返回的值應(yīng)用循環(huán)鏈,因此以下代碼的工作方式相同。

Promise.resolve(10)
.then(value => value + 1)
.then(value => Promise.resolve(value + 1))
.then(value => console.log(value)) // 12

3.then()的第二個參數(shù)

then() 實(shí)際上有 2 個參數(shù)。 第二個參數(shù)采用一個函數(shù)來處理拒絕的情況。 它與 catch() 的工作方式非常相似。 以下代碼的結(jié)果是相同的。

/// then() with second parameter
Promise.reject(10)
.then(
value => value + 1,
reason => handleError(reason), // reason=10
)/// then() and catch()
Promise.reject(10)
.then(value => value + 1)
.catch(reason => handleError(reason)) // reason=10

如果我們兩個都像下面這樣呢?

Promise.reject(10)
.then(
value => value + 1,
reason => handleError1(reason), // called
)
.catch(reason => handleError2(reason)) // not called

如果兩者都給出,則 then() 的第二個參數(shù)在 catch() 之前,因此調(diào)用了 handleError1() 而不會調(diào)用 handleError2()。 唯一的例外是 Promise 實(shí)際拋出錯誤的情況。 請參閱下面的代碼。

new Promise(() => { throw 'error' })
.then(
value => value + 1,
reason => handleError1(reason), // not called
)
.catch(reason => handleError2(reason)) // called

它僅在 catch() 子句中捕獲錯誤,因此調(diào)用了 handleError2()。 一個有趣的部分是,如果它沒有 catch(),即使使用 onReject 參數(shù)也會拋出錯誤。

4. then() 中拋出錯誤

如果 then() 中發(fā)生錯誤,它會在 catch() 子句中捕獲。

Promise.resolve(10)
.then(value => { throw 'error' })
.catch(reason => handleError(reason)) // catch!

5.錯誤作為一個值

如果我們嘗試用錯誤來解決,這聽起來很有趣。 你能想象下面的代碼會發(fā)生什么嗎?

Promise.resolve(new Error('error'))
.then(value => console.log(value)) // Error value
.catch(reason => handleError(reason))

它不會捕獲但會正常解析,因此它會記錄原始錯誤。 Promise 不賦予 Error 權(quán)限,而是 Promise 本身。

..和一個建議

Promise 模式對于處理異步作業(yè)很有用,但它通常涉及帶有嵌套 Promise 的曲線代碼。 它不利于閱讀,因此另一種選擇是使用 async/await。 現(xiàn)代 JavaScript 打包器提供了 async/await 語法的轉(zhuǎn)換。

責(zé)任編輯:華軒 來源: 七爪網(wǎng)
相關(guān)推薦

2014-11-14 17:39:23

云計算

2024-01-09 14:57:22

2012-02-07 13:29:35

2013-01-06 14:11:34

手機(jī)版Ubuntu系統(tǒng)

2010-09-02 18:56:09

NoSQL數(shù)據(jù)庫DBA

2018-08-23 08:21:54

TensorFlow機(jī)器學(xué)習(xí)人工智能

2022-05-05 14:06:08

AWS云服務(wù)云計算專家

2021-05-19 18:23:40

物聯(lián)網(wǎng)IOT物聯(lián)網(wǎng)技術(shù)

2019-01-08 17:00:39

2023-10-16 13:36:00

邊緣計算數(shù)據(jù)

2015-02-02 14:12:03

云桌面

2022-04-22 14:28:18

加密推特比特幣加密貨幣

2020-03-25 14:58:12

人工智能平安城市智慧城市

2022-11-16 14:23:37

JavaScript參數(shù)屬性

2015-03-11 11:23:38

MySQLPHP開發(fā)

2019-02-19 09:34:53

工業(yè)物聯(lián)網(wǎng)IIOT物聯(lián)網(wǎng)

2020-08-10 15:30:24

XDR網(wǎng)絡(luò)安全網(wǎng)絡(luò)威脅

2024-01-11 11:28:54

2018-03-22 16:32:49

大數(shù)據(jù)數(shù)據(jù)集數(shù)據(jù)處理

2015-09-02 10:12:17

數(shù)據(jù)安全云存儲
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號