【发布时间】:2020-09-20 23:15:39
【问题描述】:
我试图了解 Promise.all() 到底在做什么。
据我所知, promise 是在 javascript 中为异步执行保存返回值的东西。
因此,promise 封装的值(?)不能在同步运行中直接访问。
(术语警告!我将使用类比来说明我如何看待 promise 和 promise.all())
要直接访问承诺值, 我需要剥掉一个叫做promise的外壳,它是 promise.all 在异步函数的末尾。
在这个“剥离”之后,我可以访问一个同步可用的值。
我对 Promise.all 的理解正确吗?
非常感谢。
示例来自 mdn 网站。
const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'foo');
});
Promise.all([promise1, promise2, promise3]).then((values) => {
console.log(values);
});
// expected output: Array [3, 42, "foo"]
同步执行“console.log()”成功处理了所有承诺和同步值 (const promise2)。
如果我不像下面这样剥离承诺外壳,
Promise.all([promise2, promise3]).then((values) => {
console.log(values);
console.log(promise1)
});
js吐出来的值如下。
数组 [42, "foo"]
[对象承诺]
请随时批评我的类比和 如果我理解有误,请告诉我。
提前谢谢你。
【问题讨论】:
-
没有。你不能“解开”一个承诺——没有办法立即访问一个未来的价值。
Promise.all的重点是将promise1.then(value1 => console.log(value1)); promise2.then(value2 => console.log(value2));更改为Promise.all([promise1, promise2]).then(([value1, value2]) => console.log(value1, value2));值在then回调中异步访问。
标签: javascript asynchronous promise