![](/img/trans.png)
[英]How to return values from a promise and async / await function in 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
,我需要先獲取user
和categories
。 這些來自數據庫,所以我使用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。
沒有。
您可以返回正常值或Promise 。 如果它是正常值 ,則在分配給變量之前將其轉換為已resolved Promise
。 我猜想這在規范中的意圖是它對於控制結構的靈活性是有用的,但事實是如果你不是在awaiting
Promise,你會發現幾乎所有的時候你都可以使用一個正常的變量,你只是旋轉齒輪:
大多數情況下,如上所述, 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.