繁体   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