2016-09-24 93 views
16

我試圖將兩個異步函數鏈接在一起,因爲第一個函數有一個條件返回參數,導致第二個參數運行或退出模塊。但是,我發現了在規格中找不到的奇怪行爲。在異步函數外使用await

async function isInLobby() { 
    //promise.all([chained methods here]) 
    let exit = false; 
    if (someCondition) exit = true; 
} 

這是我的代碼片段bastardized(你可以看到完整的範圍here),即只檢查是否已經在大堂的球員,但是這無關緊要。

接下來我們有這個異步函數。

async function countPlayer() { 
    const keyLength = await scardAsync(game); 
    return keyLength; 
} 

該功能不需要運行,如果exit === true

我試圖做

const inLobby = await isInLobby(); 

此我希望將等待到的結果,所以我可以用inLobby有條件地運行countPlayer,但是我收到一個類型錯誤,沒有具體細節。

爲什麼你不能在awaitasync函數的函數範圍之外?我知道這是一個糖的承諾,所以它必須鏈接到then但爲什麼它在countPlayer我可以等待另一個承諾,但在外面,我不能awaitisInLobby

+0

您能告訴我們您在哪裏*等待了isInLobby()',以及如何使用inLobby?另外,在哪裏/如何調用'countPlayer'? – Bergi

+0

@Bergi我鏈接我的回購實際上下文。太多的代碼放入問題 –

+0

我沒有看到問題出在哪裏(也許你已經更新了回購)?如果你引用了'isInLobby()。then(... countPlayer()。then ...')部分,那麼解決方案就很簡單了:只需要包含這些調用的函數('(req,res)=>') 'async'。 – Bergi

回答

26

頂級await不支持。標準委員會爲什麼會進行一些討論,如this Github issue

還有一個thinkpiece on Github關於爲什麼最高級別等待是一個壞主意。具體他建議,如果你有這樣的代碼:

// data.js 
const data = await fetch('/data.json'); 
export default data; 

現在任何文件導入​​不會執行,直到獲取完成,因此所有的模塊加載的已被鎖住。這使得很難推斷應用程序模塊的順序,因爲我們習慣於同步和可預測地執行頂級Javascript。如果這是允許的,知道函數何時被定義變得棘手。

+0

這是一個很好的鏈接,謝謝。這是一個恥辱的頂級支持不存在。我希望是。目前,我必須在這裏嵌套我的承諾,這是非常糟糕的做法,我不喜歡它。 (謝謝) –

+0

@SterlingArcher或者使用異步IIFE:void異步函數(){const inLobby = await isInLobby()}()' – robertklep

+0

@robertklep不會將函數的作用域設置爲'inLobby'可訪問嗎? –

16

總是有這門課程的:

(async() => { 
    await ... 
})(); 

這使得一個快速的功能與異步這裏可以用等待。它可以節省您製作非常好的異步功能的需求! // credits Silve2611

+0

請進一步闡述並解釋其原因 –

+2

這是非常愚蠢的解決方案這是一個使用異步的快速函數,您可以使用await,它可以節省您製作異步函數的必要性太棒了! – Silve2611

+3

由於您仍然需要「等待」這個匿名函數,所以它不能解決問題,而這個函數又不能從函數外部工作。 – Michael