簡體   English   中英

異步函數中的等待函數是否必須返回一個promise? (的node.js)

[英]Does an await-ed function inside an async function have to return a promise? (node.js)

async function someAsyncFunc() {
    const [user, categories] = await Promise.all([
        asyncGetUser(),
        asyncGetCategories()
    ]);
    const mapping = await asyncMapUserWithCategory(user, categories);
};

要獲得mapping ,我需要先獲取usercategories 這些來自數據庫,所以我使用Promise.all立即獲取它們然后將它們提供給asyncMapUserWithCategory() (不知道為什么我之前已經等待了,但是沒關系)。 我很確定asyncGetUser()asyncGetCategories()必須返回promises。 編輯: ..,或一個值。 (對不起,忘了這個)

如果我在沒有Promise.all情況下做同樣的Promise.all (下面,我認為速度較慢),await-ed函數是否還需要返回promises才能Promise.all

async function someAsyncFunc() {
    const user = await asyncGetUser();
    const categories = await asyncGetCategories();
    const mapping = await asyncMapUserWithCategory(user, categories);
};

等待不是承諾的東西不會是語法錯誤或類似的東西。 但是,它也不會做任何注意事項。 你沒有告訴它該等什么,所以它會立即恢復。

我的建議:如果代碼是同步的,請不要等待,以使其更加明顯,它是同步的。 如果它是異步的,那么返回一個promise並等待該promise。

我很確定asyncGetUser()asyncGetCategories()必須返回promises。

不,他們不需要。

await -ed函數是否還需要返回promises才能生效?

不, await是一樣的

回答:

沒有。


為什么?

您可以返回正常值Promise 如果它是正常值 ,則在分配給變量之前將其轉換為已resolved Promise 我猜想這在規范中的意圖是它對於控制結構的靈活性是有用的,但事實是如果你不是在awaiting Promise,你會發現幾乎所有的時候你都可以使用一個正常的變量,你只是旋轉齒輪:


MDN說什么?

Await的描述 MDN

例外:

大多數情況下,如上所述, await僅在與Promise使用時才有用。 為了平衡,一個值可能對await函數有用的情況的一個例子是,根據當前環境提供API調用或測試數據的引用。

否則,由於已經陳述的原因,這是罕見的。 希望這可以幫助!

您可以等待非異步(非Promise返回)函數:

function sum(num1, num2) { return num1 + num2 };
async function main() {
    const s = await sum(2, 3); // this resolves immediately
}

是的,你的第二個功能運行得慢:

async function someAsyncFunc() {
    const user = await asyncGetUser();
    const categories = await asyncGetCategories(); 
    const mapping = await asyncMapUserWithCategory(user, categories);
};

因為asyncGetCategories()只會在asyncGetUser()結算后asyncGetUser()


而在您的第一個示例中,這兩個調用同時運行:

async function someAsyncFunc() {
    const [user, categories] = await Promise.all(asyncGetUser(), asyncGetCategories()];
    const mapping = await asyncMapUserWithCategory(user, categories);
};

這將類似於:

async function someAsyncFunc() {
    const userPromise = asyncGetUser();
    const categoriesPromise = asyncGetCategories();
    const user = await userPromise;
    const categories = await categoriesPromise;
    const mapping = await asyncMapUserWithCategory(user, categories);
};

在這兩個示例中,兩個異步操作同時啟動,沒有一個等待另一個來解決。

首先,尊重你的問題的標題, 所有標記為async函數都返回一個Promise ,即使你沒有明確返回一個。

如果我在沒有Promise.all的情況下做同樣的事情(下面,我認為速度較慢),await-ed函數是否還需要返回promises才能生效?

是的(邏輯上,要工作,不要)。 如果使用await ,則意味着await-ed函數返回Promise; 否則,在同步函數中使用await沒有邏輯推理。

我想比較慢

嗯,使用Promise.all與每次運行promises沒有什么重大區別。 實際上, Promise.all執行 promise,因為promise的任務是在實例化時啟動的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM