javascript - promise.all 是用来解封装 promise 值的吗?
问题描述
我试图了解 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 如何工作的普遍看法。Promise是管理延迟值的结构——这些值将在某个阶段依赖于时间。使用“包装”一词听起来像是价值已经存在,而实际上它很可能还没有。
Promise 可用于表示来自 API 的响应,或者可能来自数据库的查找 - 这两者都需要时间- 这是同步代码无法处理的。你可能会提出一个请求,并得到一个承诺作为回应。然后,您可以使用此 Promise 作为助手来获取您打算接收的值。
当您调用 时promise.then(value => ...)
,该then
函数正在等待,直到值准备好。在 promise 内部,必须在函数触发resolve(value)
之前调用某些东西then
(注意,promise 也可以通过 拒绝reject
,在这种情况下promise.catch
会被触发)。这是一个完整的例子:
const promise = new Promise(resolve => {
setTimeout(() => {
resolve(10);
}, 2000);
});
promise.then(value => {
// This fires after about 2 seconds
console.log(value); // 10
});
所以这里的技巧是想象从一个承诺中获得结果发生在不同的“线程”上。也许是在回调或await
调用之后。此外,一旦一个 promise 被解决,then
第二次调用将返回与之前相同的值,并且它会更快,但仍然不是即时的,因为 promises“值”总是异步返回。
Promise.all 等到所有提供的 Promise 都已解决。返回的Promise.all
是一个数组,其中包含按顺序解析的所有结果。因此,如果您有以下情况:
const promise1 = Promise.resolve(12); // Asynchronously returns 12
const promise2 = new Promise(resolve => {
setTimeout(() => {
resolve(10);
}, 2000);
});
Promise.all([promise1, promise2]).then(results => {
// results will be [12, 10], and will fire after about 2 seconds
});
// here, even though we're after the promise assignments,
// the values to BOTH of the promises are still not yet defined (not resolved)
TLDR;Promise 是一个类,它在其提供的函数解析后记录一个值。then
一旦由promise函数设置(通过调用resolve或reject),该方法将使用该值调用其回调。
推荐阅读
- dart - 如何在颤振飞镖中使用具有多个条件的三元运算符?
- magento - Aem Magento 集成,aem 订单未在 magento 中显示
- android - 找不到符号类 RTCClientVideoTracksCallback
- c# - 如何将保存在列表中的datagridview复选框列值导出到excel中
- bash - bash中的关联数组不在循环内存储值
- docker - 如何增加docker容器的预分配内存?
- rest - Keycloak:为 api 创建用户时无法映射用户角色
- java - 如何遍历整数流?同时在迭代期间我必须检查它的某些条件
- java - Java Swing 实时(同步/协作)实时数据更新
- java - 调用递归函数时,成员变量是否仍在缓冲区中?