JavaScript 中使用Promise.all()方法经验技巧详解

 更新时间:2023年10月08日 09:06:02   作者:王大冶  
这篇文章主要为大家介绍了JavaScript 中使用Promise.all()方法经验技巧详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

JavaScript 中的 Promises 是什么?

如果你偶然发现了这篇文章,你可能已经对 promises 很熟悉了。但对于那些新接触 JavaScript 的人来说,我们来详细解释一下。

从本质上讲,Promise 对象表示异步操作的最终完成或失败。有趣的是,当 promise 被创建时,其值可能不会立即可用。

const promise = new Promise((resolve, reject) => {  
  // 一些异步操作  
  if (/* 操作成功 */) {    
    resolve(result);  
  } else {    
    reject(error);  
  }
});

它们有3种状态:

  • Pending(待定):这是初始状态,既没有实现也没有被拒绝。
  • Fulfilled(已实现):当 promise 成功完成并产生值时的状态。
  • Rejected(已拒绝):当发生错误并且 promise 中的操作不成功时的状态。

一旦 promise 被解决,你可以使用 .then() 来处理结果,使用 .catch() 来管理其执行过程中出现的任何错误。

promise  
  .then(result => {    
    console.log('成功:', result);  
  })  
  .catch(error => {    
    console.error('错误:', error);  
  });

理解 Promise.all()

当同时处理多个 promises 时,你可以利用内置的 Promise.all([]) 方法。此方法接受一个 promises 数组并返回一个统一的 promise。关键是,只有当所有输入的 promises 都成功解决时,这个组合的 promise 才会解决。如果其中一个失败,整个 promise 就会被拒绝。以下是一个例子:

const promise1 = fetch('https://api.example.com/data1');
const promise2 = fetch('https://api.example.com/data2');
const promise3 = fetch('https://api.example.com/data3');
Promise.all([promise1, promise2, promise3])  
  .then(values => {    
    console.log('所有数据已获取:', values);  
  })  
  .catch(error => {    
    console.error('发生错误:', error);  
  });

这种方法通常用于多个相关异步任务且其工作相互依赖的情况,因此我们希望在继续执行代码之前,所有异步任务都能成功。

揭示 Promise.allSettled()

使用 Promise.allSettled([]) 与 Promise.all([]) 类似,但不同之处在于它会等待所有输入的 promises 完成或被拒绝,并返回描述每个 promise 结果的对象数组。

const promise1 = Promise.resolve('成功 1');
const promise2 = Promise.reject('错误 2');
const promise3 = Promise.resolve('成功 3');
Promise.allSettled([promise1, promise2, promise3])
  .then(results => {
    results.forEach(result => {
      if(result.status === 'fulfilled') {
        console.log('成功取得值:', result.value);
      } else {
        console.error('因为原因被拒绝:', result.reason);
      }
    });
 });
//输出
// 成功取得值:成功 1
// 因为原因被拒绝:错误 2
// 成功取得值:成功 3

它通常用于处理不互相依赖的异步操作,你想知道每一个的结果。

为什么 Promise.allSettled() 更出色

总的来说,使用 Promise.allSettled() 而不是 Promise.all() 在大多数常见情况下都有其优势:

全面的结果信息

如果 promises 中的任何一个被拒绝,Promise.all() 的立即拒绝可能会使得确定其他 promises 的状态变得困难,尤其是当其他 promises 成功解决时。

使用 Promise.allSettled([]) 可以为你提供结果的完整画面。

优雅的错误处理

Promise.all() 的“快速失败”方法在你想继续进行,而其中一个失败时可能会受到限制,而 Promise.allSettled() 允许你单独处理每个 promise 的结果。

批量操作

当处理批量操作时,其中的单个操作是独立的,你可能不希望整个批次因操作失败而失败。

明智的决策

使用 Promise.allSettled() 后,你可以在获得所有 promises 的结果后做出更明智的决策。

例如,当你从不同的 API 获取数据,其中一个失败时,你可以决定是否继续处理数据或提供带有错误消息的通知。

增强的用户体验

通常,为用户提供必要的部分结果和错误通知要比使用某些通用消息使整个操作失败更好。

Promise.allSettled() 使这种方法易于实施。

总结

总之,Promise.all() 在某些情况下可能很有价值,但 Promise.allSettled() 为大多数场景提供了更灵活和更有韧性的方法,更多关于JavaScript Promise.all的资料请关注脚本之家其它相关文章!

相关文章

  • 16个最流行的JavaScript框架[推荐]

    16个最流行的JavaScript框架[推荐]

    这篇文章列举了当下最流行的16个 JavaScript 框架,既包含 jQuery 和 Mootools 等常规框架,也有Zepo这种支持智能手机触摸功能的移动JavaScript框架,如果你有更好的框架推荐,欢迎与我们分享。
    2011-05-05
  • javascript中使用未定义变量或值的情况分析

    javascript中使用未定义变量或值的情况分析

    这篇文章主要介绍了javascript中使用未定义变量或值的情况,较为详细的分析了javascript中使用未定义值的情况,需要的朋友可以参考下
    2016-07-07
  • 基于javascript实现文字无缝滚动效果

    基于javascript实现文字无缝滚动效果

    这篇文章主要介绍了基于javascript实现文字无缝滚动效果的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • javascript实现文字图片上下滚动的具体实例

    javascript实现文字图片上下滚动的具体实例

    这篇文章介绍了在JS中文字图片上下滚动的实现代码,需要的朋友可以参考一下
    2013-06-06
  • js验证框架实现代码分享

    js验证框架实现代码分享

    这篇文章主要为大家分享了一个非常实用的js验证框架实现源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • 理解Javascript_01_理解内存分配原理分析

    理解Javascript_01_理解内存分配原理分析

    在正式开始之前,我想先说两句,理解javascript系列博文是通过带领大家分析javascript执行时的内存分配情况,来解释javascript原理,具体会涵盖javascript预加载,闭包原理,面象对象,执行模型,对象模型...,文章的视角很特别,也非常深入,希望大家能接受这种形式,并提供宝贵意见。
    2010-10-10
  • 深入浅析JSONAPI在PHP中的应用

    深入浅析JSONAPI在PHP中的应用

    这篇文章主要介绍了深入浅析JSONAPI在PHP中的应用,需要的朋友可以参考下
    2017-12-12
  • 通过JS来判断页面控件是否获取焦点

    通过JS来判断页面控件是否获取焦点

    本篇文章主要介绍了通过JS来判断页面控件是否获取焦点的方法。需要的朋友可以过来参考下,希望对大家有所帮助
    2014-01-01
  • 关于js的事件循环机制剖析

    关于js的事件循环机制剖析

    JS事件循环机制,最常用到的地方应该是做面试题,经常给出一段代码,让你写出console.log()顺序,下面这篇文章主要给大家介绍了关于js事件循环机制的相关资料,需要的朋友可以参考下
    2021-06-06
  • fetch跨域问题的使用详解

    fetch跨域问题的使用详解

    这篇文章主要介绍了fetch跨域问题的使用详解,fetch 的核心主要包括:Request , Response , Header , Body,利用了请求的异步特性 --- 它是基于 promise 的,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-09-09

最新评论