异步函数中的等待函数是否必须返回诺言? (node.js)

时间:2019-05-14 19:33:24

标签: javascript node.js promise

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

要获取mapping,我需要先获取usercategories。它们来自数据库,因此我立即使用Promise.all来获取它们,然后将它们提供给asyncMapUserWithCategory()(不确定为什么在此之前我要等待,但是没关系)。我非常确定asyncGetUser()asyncGetCategories()必须返回承诺。编辑: ..或一个值。 (对不起,忘了这个)

如果我在没有Promise.all的情况下做了同样的事情(下面,我想比较慢),等待的函数是否还需要返回诺言才能使之工作?

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

5 个答案:

答案 0 :(得分:0)

等待不是承诺的事情不会是语法错误或类似的错误。但是,它也不会引起任何注意。您没有告诉它要等待什么,因此它将立即恢复。

我的建议:如果代码是同步的,则不要等待,以使其更明显地表明它是同步的。如果它是异步的,则返回一个承诺并等待该承诺。

答案 1 :(得分:0)

  

我非常确定asyncGetUser()asyncGetCategories()必须返回承诺。

No, they don't need to.

  

await版的函数是否还需要返回promise才能起作用?

不,it's the same for await

答案 2 :(得分:0)

答案:

不。


为什么?

您可以返回正常值承诺。如果它是正常值,则在分配给变量之前将其转换为resolved Promise。我想在规范中这样做的意图是,它对于控制结构的灵活性很有用,但是事实是,如果您不是awaiting完全不是Promise,您会发现几乎所有时间以及使用普通变量,您只是在旋转齿轮:


MDN说什么?

Description of Await MDN

例外:

如上所述,在大多数情况下,await仅在与Promise一起使用时才有用。为了达到平衡,一个示例值可以与await函数一起使用的情况的例子是根据当前环境提供API调用或对测试数据的引用时。

否则,由于已经说明的原因,这是很少见的。希望这会有所帮助!

答案 3 :(得分:0)

您可以等待一个非异步(非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()解决之后才会被调用。


在您的第一个示例中,这两个调用同时运行:

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);
};

在这两个示例中,两个异步操作是同时启动的,没有一个等待另一个稳定下来。

答案 4 :(得分:0)

首先,考虑到您的问题的标题,所有标有async的函数都会返回一个诺言,即使您没有明确返回一个

  

如果我在没有Promise的情况下做了同样的事情。all(下面,我想是慢一点),等待的函数还需要返回promise才能使它工作吗?

是的(从逻辑上讲,是工作,而不是)。如果使用await,则意味着函数 await-ed 返回Promise;否则,在逻辑上没有理由在同步功能中使用等待。

  

我想慢一点

好吧,Promise.all的使用与每次运行诺言没有太大区别。实际上,Promise.all不会执行承诺,因为在实例化承诺时会启动承诺的任务