跳至主要內容

2723. 两个 Promise 对象相加


2723. 两个 Promise 对象相加open in new window

🟢   🔗 力扣open in new window LeetCodeopen in new window

题目

Given two promises promise1 and promise2, return a new promise. promise1 and promise2 will both resolve with a number. The returned promise should resolve with the sum of the two numbers.

Example 1:

Input:

promise1 = new Promise(resolve => setTimeout(() => resolve(2), 20)),

promise2 = new Promise(resolve => setTimeout(() => resolve(5), 60))

Output: 7

Explanation: The two input promises resolve with the values of 2 and 5 respectively. The returned promise should resolve with a value of 2 + 5 = 7. The time the returned promise resolves is not judged for this problem.

Example 2:

Input:

promise1 = new Promise(resolve => setTimeout(() => resolve(10), 50)),

promise2 = new Promise(resolve => setTimeout(() => resolve(-12), 30))

Output: -2

Explanation: The two input promises resolve with the values of 10 and -12 respectively. The returned promise should resolve with a value of 10 + -12 = -2.

Constraints:

  • promise1 and promise2 are promises that resolve with a number

题目大意

给定两个 promise 对象 promise1promise2,返回一个新的 promise。promise1promise2 都会被解析为一个数字。返回的 Promise 应该解析为这两个数字的和。

示例 1:

输入:

promise1 = new Promise(resolve => setTimeout(() => resolve(2), 20)),

promise2 = new Promise(resolve => setTimeout(() => resolve(5), 60))

输出: 7

解释: 两个输入的 Promise 分别解析为值 2 和 5。返回的 Promise 应该解析为 2 + 5 = 7。返回的 Promise 解析的时间不作为判断条件。

示例 2:

输入:

promise1 = new Promise(resolve => setTimeout(() => resolve(10), 50)),

promise2 = new Promise(resolve => setTimeout(() => resolve(-12), 30))

输出: -2

解释: 两个输入的 Promise 分别解析为值 10 和 -12。返回的 Promise 应该解析为 10 + -12 = -2。

提示:

  • promise1 和 promise2 都是被解析为一个数字的 promise 对象

解题思路

  1. Promise 解析:JavaScript 的 Promise 是一种用于异步操作的对象,支持异步操作结束后(不论是成功还是失败)执行相应的处理代码。我们需要从两个 Promise 中解析出它们的值。

  2. 组合 Promise:可以使用 Promise.all() 来处理多个 Promise,它接收一个 Promise 数组,并返回一个新的 Promise,当所有输入的 Promise 都解决(fulfilled)时,新的 Promise 也会被解决,并且其解析值为输入 Promise 的解析值组成的数组。

  3. 返回结果:当两个 Promise 都成功解析后,我们将它们的值相加,并返回一个新的 Promise。

复杂度分析

  • 时间复杂度O(1),因为 Promise.all() 会并发执行两个 Promise,它本身并不耗费额外时间。
  • 空间复杂度O(1),只需要常数空间来存储两个 Promise 的解析值。

代码

/**
 * @param {Promise} promise1
 * @param {Promise} promise2
 * @return {Promise}
 */
var addTwoPromises = async function (promise1, promise2) {
	return Promise.all([promise1, promise2]).then((values) => {
		return values[0] + values[1]; // 将两个 Promise 的结果相加
	});
};

/**
 * addTwoPromises(Promise.resolve(2), Promise.resolve(2))
 *   .then(console.log); // 4
 */