2017-04-07 109 views
0

我一直使用Promise很長一段時間,而且我一直都不喜歡笨重的代碼。所以我喜歡異步/等待(理論上)是有道理的。將Express應用程序從承諾轉換爲異步/等待

但是,您只能在異步函數中使用await。如果我目前有每條路線作爲功能(例如export function createLike(req, res, next)),那麼該路線可以是async function?有什麼我需要檢查,如果我這樣做?或者如果我這樣做會發生奇怪的事情?我能保持函數與所謂的內像這樣的async function正常功能(如果是這樣的話):

export function createLike(req, res, next) { 
    doStuff() // does this need to be "await doStuff()" if it's the only actionable call in the parent function? 

    async function doStuff() { 
     // do asynchronous stuff via async/await 
     res.status(200).send('success') 
    } 
} 
+0

'這是否需要「等待doStuff()」'是doStuff異步? (看起來不是異步的) - 如果你不顯示原始代碼是什麼,我們如何幫助轉換? –

+0

我想你可以使用nodeJS的async。檢查瀑布函數 –

+0

@JaromandaX'doStuff()'是異步的。我不認爲特定的異步代碼很重要,只是它需要是異步的。 @YananPicquenot爲什麼需要瀑布功能?使用async/await可以讓你鏈接不同的異步函數而不需要瀑布。或者你的意思是更容易? – Matt

回答

0
export async function createLike(req, res, next) { 

易peasy。聲明一個函數async只不過是讓它返回一個Promise。

揭開你的整個簡單的例子:

export async function createLike(req, res, next) { 
    // Don't bother putting inside a 'doStuff' if it's all you have. 
    // Get straight to the asyncing 
    const { something } = await someAsyncMethod(); 
    const { foo } = await fetch(`/get/this/${something}`).then((r) => r.json()); 
    console.log(foo); 
    res.status(200).send('success') 
} 

這將等待,直到它變得someAsyncMethod()的反應,然後取東西,發送響應之前。

+0

這很有道理。而且函數返回一個promise的事實不應該影響後續路由上的任何影響(例如錯誤處理路由),是正確的嗎? – Matt

+0

這是正確的 - afaik express不使用其函數的返回值作爲任何事情,所以它返回一個promise的事實應該被忽視。順便說一句,我不知道這個反社會病人是誰經歷和downvoting字面上的一切在這個問題上沒有解釋... –

+0

太棒了。我將通過我們的測試服務器運行一下,以確保沒有任何不合適的事情發生。我會更新你喜歡cli,如果一切順利,你將不會再聽到我的消息。如果出現問題,我會讓你知道哈哈。而且我也不知道,只是一個糟糕的一天,我猜... – Matt

0

使用koa 2+。它爲async/await東西而建。

+0

項目已經建立了快速承諾。 – Matt

+0

我建議你將它轉換爲koa,因爲Express在過去一般都是過時的,特別是在這種情況下。 –

+0

這是一個更大的事業。我可以輕鬆地將端點1轉換爲'async/await',而不必將所有內容移動到'koa'。儘管如此,我仍然會在下一個項目中牢記這一點。 – Matt