力扣刷题:添加两个promise对象

96 阅读2分钟

前言:锻炼自己的思想,规范自己的编程思路。

问题:

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

示例:(放代码里面)

输入:
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 解析的时间不作为判断条件。

思路:

函数名为 addTwoPromises 的异步函数,它接受两个参数 promise1 和 promise2。这两个参数都应该是 Promise 对象,它们都会被解析为一个数字。

函数内部使用了 Promise.all 方法来等待两个 Promise 对象都解析完成。当两个 Promise 都解析完成时,Promise.all 方法返回一个新的 Promise,它解析为一个数组,其中包含两个 Promise 解析的值。

然后,使用 then 方法来处理这个数组。在 then 方法的回调函数中,我们将数组中的两个值相加,并返回它们的和。

最终,addTwoPromises 函数返回一个新的 Promise 对象,它解析为两个输入 Promise 解析值的和。

基于上述思考,代码如下:

/**
 * @param {Promise} promise1
 * @param {Promise} promise2
 * @return {Promise}
 */
var addTwoPromises = async function(promise1, promise2) {
  return Promise.all([promise1, promise2])
    .then(values => {
      const sum = values[0] + values[1];
      return sum;
    });
}

执行结果如下图:

image-20230619211338118.png

学到的知识:

Promise.all 方法接受一个可迭代对象(例如数组)作为参数,其中包含多个 Promise 对象。它返回一个新的 Promise 对象,当且仅当所有传入的 Promise 对象都解析完成时,这个新的 Promise 才会解析完成。

如果所有传入的 Promise 都解析为成功状态(即 fulfilled),那么 Promise.all 返回的 Promise 也会解析为成功状态。它解析为一个数组,其中包含所有传入的 Promise 解析的值,顺序与传入的顺序相同。

如果有任何一个传入的 Promise 解析为失败状态(即rejected),那么 Promise.all返回的 Promise 也会立即解析为失败状态。它解析为第一个失败的 Promise 解析的原因。