首页 > 解决方案 > 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"]

[对象承诺]

请随时批评我的类比,如果我理解错误,请告诉我。

先感谢您。

标签: javascriptasynchronouspromise

解决方案


您的类比是一个非常有趣的类比,但我相信这是对 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),该方法将使用该值调用其回调。


推荐阅读