Promise.all 的方法还没执行完就执行了.then

文章讲述了在处理JavaScript中Promise.all时遇到的加载异常,由于数组中的Promise方法未返回值,导致Promise.all解析为值而非方法。解决方案是确保在调用API时使用return,使Promise.all中的数组元素变为方法。作者还解释了Promise.all的工作原理和错误处理机制。
摘要由CSDN通过智能技术生成

碰见一个问题,接盘了一个有问题的页面修改。

改变日期后 查询很多数据再去重新加载页面上的数据显示相关的组件。

问题就来了。

加载异常捏……

最后我一通查:

重点来了

是因为这个Promise.all(数组),里边这个数组的问题。现在是在数据中定义的方法的调用,但是在定义这些请求方法的时候,没有写return,结果这些数组的调用的方法就变成了值。

解决方案:只要在调用这个API的时候,前边加一个return,让Promise.all()中的数组都是方法,而不是值就可以了。

详细记一下

在JavaScript中,Promise.all方法用于将多个Promise实例组合成一个新的Promise实例。

当我们在Promise.all的方法还没执行完就直接调用.then方法,实际上是在调用Promise.all返回的新的Promise实例的.then方法。这种情况下,.then方法会在所有组合的Promise实例都成功解决之后被调用。

这种情况下,.then方法中的回调函数会接收到一个数组,这个数组中的每个元素都是对应的Promise实例解决的值。

下面是一个简单的例子:

 
javascriptlet promise1 = Promise.resolve(3);
let promise2 = Promise.resolve(4);
let promise3 = Promise.resolve(5);

Promise.all([promise1, promise2, promise3]).then(function(values) {
console.log(values); // [3, 4, 5]
});

在这个例子中,Promise.all的方法可能还没执行完就调用了.then方法,当所有的Promise实例都成功解决后,.then方法中的回调函数会被调用,并输出每个Promise实例解决的值组成的数组。

注意,如果任何一个Promise实例失败了,Promise.all会立即reject,并返回第一个失败的Promise实例返回的失败原因。

 
javascriptlet promise1 = Promise.resolve(3);
let promise2 = Promise.reject(4);
let promise3 = Promise.resolve(5);

Promise.all([promise1, promise2, promise3]).then(function(values) {
console.log(values);
}).catch(function(reason) {
console.log(reason); // 4
});

在这个例子中,promise2是一个失败的Promise实例,因此Promise.all会立即reject,并返回失败原因4,.then方法中的回调函数不会被调用。

  • 14
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Promise.all() 是一个用于并行执行多个 Promise方法,它接收一个 Promise 数组作为参数,并返回一个新的 Promise 对象。这个新的 Promise 对象在所有传入的 Promise成功成后才会被解析,如果其中任何一个 Promise 失败,则整个 Promise.all() 会立即被拒绝。 关于获取 Promise.all() 的执行时间,可以通过以下步骤来实现: 1. 创建一个包含多个异步操作的 Promise 数组。 2. 使用性能计时器(如 performance.now())记录开始时间。 3. 调用 Promise.all() 方法,并传入 Promise 数组作为参数。 4. 使用 then() 方法来处理 Promise.all() 返回的新 Promise 对象。 5. 在 then() 方法中,使用性能计时器记录结束时间,并计算执行时间差。 下面是一个示例代码: ```javascript const promises = [ new Promise(resolve => setTimeout(resolve, 1000)), new Promise(resolve => setTimeout(resolve, 2000)), new Promise(resolve => setTimeout(resolve, 3000)) ]; const startTime = performance.now(); Promise.all(promises) .then(() => { const endTime = performance.now(); const executionTime = endTime - startTime; console.log(`Promise.all() 执行时间:${executionTime} 毫秒`); }) .catch(error => { console.error(error); }); ``` 在上述示例中,我们创建了一个包含三个异步操作的 Promise 数组,并使用 performance.now() 记录了开始时间。然后,调用 Promise.all() 方法并使用 then() 方法来处理返回Promise 对象。在 then() 方法中,我们再次使用 performance.now() 记录了结束时间,并计算了执行时间差。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LXXgalaxy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值