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()
必须返回承诺。编辑: ..或一个值。 (对不起,忘了这个)
如果我在没有Promise.all
的情况下做了同样的事情(下面,我想比较慢),等待的函数是否还需要返回诺言才能使之工作?
async function someAsyncFunc() {
const user = await asyncGetUser();
const categories = await asyncGetCategories();
const mapping = await asyncMapUserWithCategory(user, categories);
};
答案 0 :(得分:0)
等待不是承诺的事情不会是语法错误或类似的错误。但是,它也不会引起任何注意。您没有告诉它要等待什么,因此它将立即恢复。
我的建议:如果代码是同步的,则不要等待,以使其更明显地表明它是同步的。如果它是异步的,则返回一个承诺并等待该承诺。
答案 1 :(得分:0)
我非常确定
asyncGetUser()
和asyncGetCategories()
必须返回承诺。
await
版的函数是否还需要返回promise才能起作用?
答案 2 :(得分:0)
不。
您可以返回正常值或承诺。如果它是正常值,则在分配给变量之前将其转换为resolved Promise
。我想在规范中这样做的意图是,它对于控制结构的灵活性很有用,但是事实是,如果您不是awaiting
完全不是Promise,您会发现几乎所有时间以及使用普通变量,您只是在旋转齿轮:
如上所述,在大多数情况下,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
不会执行承诺,因为在实例化承诺时会启动承诺的任务。