原文:jakearchibald.com/2017/await-…
翻譯:瘋狂的技術宅在編寫非同步函式時,
await
、return
與return 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...