正確使用非同步函式的姿勢

2021-09-11 12:51:21 字數 1965 閱讀 4328

原文:jakearchibald.com/2017/await-…

翻譯:瘋狂的技術宅

在編寫非同步函式時,awaitreturnreturn await之間存在差異,選擇正確的處理方式非常重要。

讓我們先從這個非同步函式開始:

async

function

waitandmaybereject()

複製**

這段**將返回乙個等待一秒的promise,同時各有一半的可能性返回'yay』或者錯誤。 接下來我們以一些微妙的其他方式使用它:

async

function

foo()

catch (e)

}複製**

在這裡,如果你呼叫foo,返回的promise將始終得到undefined,而不是waiting

由於我們沒有 await 或返回waitandmaybereject()的結果,因此**不會對它做出任何反應。 像這樣的**通常是錯誤的。

async

function

foo()

catch (e)

}複製**

在這裡,如果你呼叫foo,返回的promise將始終等待一秒鐘,然後得到返回值undefined,或者返回'caught'

因為我們awaitwaitandmaybereject()的結果,它將異常情況將變為throw,並且catch塊將會被執行。 但是,如果waitandmaybereject()完成,我們不會對該值執行任何操作。

async

function

foo()

catch (e)

}複製**

在這裡,如果你呼叫foo,返回的promise將始終等待一秒,然後得到'yay',或者是error('boo!')

通過返回waitandmaybereject(),我們推遲了它的結果,所以catch塊永遠不會執行。

你在try/catch塊中真正想要的東西是return await

async

function

foo()

catch (e)

}複製**

在這裡,如果你呼叫foo,返回的promise將始終等待一秒,然後返回『yay',或者得到'caught'

因為我們awaitwaitandmaybereject()的結果,所以它的異常情況將變為throw,並且我們的catch塊將被執行。 如果waitandmaybereject()完成,那麼返回其結果。

如果上述內容令你感到困惑,可能把它分解為兩個單獨的步驟更容易理解:

async

function

foo()

catch (e)

}複製**

注意:在try/catch塊之外,return await是多餘的,甚至有乙個eslint規則來檢測它,但是它允許存在於try/catch中。

mysql中if函式的正確使用姿勢

為了今天要寫的內容,執行了將近7個小時的程式,在資料庫中儲存了1千萬條資料。今天要說的是mysql資料庫的if 函式的乙個例項。具體場景如下,先看看表結構 create table message id varchar 30 not null,title varchar 30 default nul...

mysql中if函式的正確使用姿勢

為了今天要寫的內容,執行了將近7個小時的程式,在資料庫中儲存了1千萬條資料。今天要說的是mysql資料庫的if 函式的乙個例項。具體場景如下,先看看表結構 create table message id varchar 30 not null,title varchar 30 default nul...

shape使用正確姿勢

android中常常使用shape來定義控制項的一些顯示屬性,今天看了一些shape的使用,對shape有了大體的了解,稍作總結 先看下面的 solid 實心,就是填充的意思 android color指定填充的顏色 gradient 漸變 android startcolor和android en...