前言:锻炼自己的思想,规范自己的编程思路。
问题:
给定两个 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;
});
}
执行结果如下图:
学到的知识:
Promise.all 方法接受一个可迭代对象(例如数组)作为参数,其中包含多个 Promise 对象。它返回一个新的 Promise 对象,当且仅当所有传入的 Promise 对象都解析完成时,这个新的 Promise 才会解析完成。
如果所有传入的 Promise 都解析为成功状态(即 fulfilled),那么 Promise.all 返回的 Promise 也会解析为成功状态。它解析为一个数组,其中包含所有传入的 Promise 解析的值,顺序与传入的顺序相同。
如果有任何一个传入的 Promise 解析为失败状态(即rejected),那么 Promise.all返回的 Promise 也会立即解析为失败状态。它解析为第一个失败的 Promise 解析的原因。