我有2个密码
1个代码
async function foo() {
const result1 = asyncFunc1();
const result2 = asyncFunc2();
return [result1, result2];}
2个代码
async function foo() {
const [result1, result2] = await Promise.all([
asyncFunc1(),
asyncFunc2(),
]);
return [result1,result2];}
问题 两者之间有什么区别吗?
答案 0 :(得分:2)
作为注释状态,您没有等待第一个代码片段中的函数调用,因此您将获得Promise作为返回值。但是,如果您使用了wait,则主要区别在于在第一个代码段中,asyncFunc2
在解析asyncFunc1
之前不会被执行(假设您使用await
) 。而在第二段中,asyncFunc2
紧随asyncFunc1
之后执行,无论它是否已解决。
Promise.all将按照传递函数的顺序返回结果。
请参阅Promise.All和Await的文档
答案 1 :(得分:0)
根据注释,除了您没有等待两个异步函数的结果这一事实之外,两者基本上没有区别,因此您将只能得到promise对象。异步功能不会自动等待作用域内的承诺/异步代码,它们仅允许您使用await关键字,该关键字只是停止执行,直到底层承诺被解决为止。
这里尝试说明这些差异。
需要注意的重要一点是,第一个函数的返回值不是预期的1、2。
StoreObject
这是一个玩弄的小提琴; jsfiddle。
答案 2 :(得分:-1)
只需找出答案!这是一个显示所有主要差异的代码段:
const timer = ms => new Promise(res => setTimeout(res, ms));
async function one() {
console.log("1 one called");
await timer(2000);
console.log("1 one done");
}
async function two() {
console.log("2 two called");
await timer(1000);
console.log("2 two done");
// throw new Error; // Uncomment to see another interesting behaviour
}
(async function main() {
const startParallel = Date.now();
await Promise.all([one(), two()]);
console.log(`parallel done, took ${Date.now() - startParallel}`);
const startSerial = Date.now();
await one();
await two();
console.log(`serial done, took ${Date.now() - startSerial}`);
})();