停止在 JavaScript 中使用 Promise.all()

更新日期: 2019-03-22阅读: 3.3k标签: Promise

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() 为大多数场景提供了更灵活和更有韧性的方法。


链接: https://fly63.com/article/detial/2524

你真的了解 Promise 吗?Promise 必知必会(十道题)

Promise 想必大家十分熟悉,想想就那么几个 api,可是你真的了解 Promise 吗?本文根据 Promise 的一些知识点总结了十道题,看看你能做对几道。

剖析Promise内部结构,一步一步实现一个完整的、能通过所有Test case的Promise类

本文写给有一定Promise使用经验的人,如果你还没有使用过Promise,这篇文章可能不适合你,Promise标准中仅指定了Promise对象的then方法的行为,其它一切我们常见的方法/函数都并没有指定.

Async/Await替代Promise的6个理由

Async/Await替代Promise的6个理由:Async/Await是近年来JavaScript添加的最革命性的的特性之一。它会让你发现Promise的语法有多糟糕,而且提供了一个直观的替代方法。

Promise 原理解析与实现(遵循Promise/A+规范)

Promise是JS异步编程中的重要概念,异步抽象处理对象,是目前比较流行Javascript异步编程解决方案之一,Promise 是一个构造函数, new Promise 返回一个 promise对象 接收一个excutor执行函数作为参数

简单模仿实现 Promise 的异步模式

这篇文章是考虑如何自己实现一个简单 Promise,用以理解 Promise。和原生 Promise的调用方法一样,支持链式调用,本文实现的方法只能用于参考Promise的原理,还有很多特性没有实现,比如 race,all 方法的实现。

数组的遍历你都会用了,那Promise版本的呢

在对数组进行一些遍历操作时,发现有些遍历方法对Promise的反馈并不是我们想要的结果。async/await为Promise的语法糖,文中会直接使用async/await替换Promise;map可以说是对Promise最友好的一个函数了,

Promise使用时应注意的问题

最近在使用axios库时遇到了个问题,后端接口报了500错误,但前端并未捕获到。在axios整体配置的代码中,过滤http code时,调用了filter401()、filter500(),但是这里注意并未将两个filter函数的结果返回,也就是并未返回promise,这就是导致问题出现的原因

es6 Promise 的基础用法

想必接触过Node的人都知道,Node是以异步(Async)回调著称的,其异步性提高了程序的执行效率,但同时也减少了程序的可读性。如果我们有几个异步操作,并且后一个操作需要前一个操作返回的数据才能执行

关于 Promise 的 9 个提示

你可以在 .then 里面 return 一个 Promise,每次执行 .then 的时候都会自动创建一个新的 Promise,对调用者来说,Promise 的 resolved/rejected 状态是唯一的,Promise 构造函数不是解决方案,使用 Promise.resolve

手写一款符合Promise/A+规范的Promise

Promise的一些用法在此不多赘述,本篇主要带领你手写一个Promise源码,学完你就会发现:Promise没有你想象中的那么难.本篇大概分为以下步骤:实现简单的同步Promise、增加异步功能、增加链式调用then、增加catch finally方法、增加all race 等方法、实现一个promise的延迟对象defer、最终测试

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!