[英]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.