promise.all 和 promise.allSettled

Promise.all 和 Promise.allSettled 都是用来处理多个 Promise 实例的方法,但是它们之间有几个关键的区别:

Promise.all

Promise.all 接受一个 Promise 的可迭代对象(如数组),并返回一个新的 Promise 实例。这个新的 Promise 实例会在所有输入的 Promise 都成功(resolved)后才成功(resolve),并且返回一个包含所有输入的 Promise 成功值的数组。如果输入的任何一个 Promise 失败(rejected),那么 Promise.all 返回的 Promise 也会立刻失败,并且失败的原因是第一个失败的 Promise 的失败原因。

例子
const p1 = Promise.resolve(3);
const p2 = 42;
const p3 = new Promise((resolve, reject) => setTimeout(resolve, 100, 'foo'));

Promise.all([p1, p2, p3]).then((values) => {
  console.log(values); // expected output: Array [3, 42, "foo"]
});

const p4 = Promise.reject(new Error('Whoops!'));

Promise.all([p1, p2, p4]).catch((reason) => {
  console.log(reason); // expected output: Error: Whoops!
});

Promise.allSettled

Promise.allSettled 同样接受一个 Promise 的可迭代对象,并返回一个新的 Promise 实例。这个新的 Promise 实例会在所有输入的 Promise 都已解决(settled,即 resolved 或 rejected)后才成功(resolve),并且返回一个包含所有输入的 Promise 结果的对象数组。这些对象具有 status 和 value(对于 resolved 的 Promise)或 reason(对于 rejected 的 Promise)属性。

例子
const p1 = Promise.resolve(3);
const p2 = Promise.reject(new Error('Failed'));
const p3 = 42;

Promise.allSettled([p1, p2, p3]).then((results) => {
  results.forEach((result, i) => {
    console.log(`Promise ${i} status: ${result.status}`);
    if (result.status === 'fulfilled') {
      console.log(`Value: ${result.value}`);
    } else if (result.status === 'rejected') {
      console.log(`Reason: ${result.reason.message}`);
    }
  });
});
// 输出:
// Promise 0 status: fulfilled
// Value: 3
// Promise 1 status: rejected
// Reason: Failed
// Promise 2 status: fulfilled
// Value: 42

区别总结

行为差异:Promise.all 会在任何一个输入的 Promise 失败时立即失败,而 Promise.allSettled 则会等待所有输入的 Promise 解决(无论是成功还是失败)后才成功。
返回值差异:Promise.all 返回的是一个包含所有成功值的数组,而 Promise.allSettled 返回的是一个包含每个 Promise 的解决状态的对象数组。
在 Vue 模板中的应用
在 Vue 模板中,如果你需要确保所有请求都完成后再做某些操作,无论这些请求是否成功,你应该使用 Promise.allSettled。这样可以确保不会因为某个请求失败而导致其他请求的数据丢失。
例如,在 Vue 组件中使用 Promise.allSettled:

methods: {
  async fetchData() {
    try {
      const results = await Promise.allSettled([
        axios.get('/api/data1'),
        axios.get('/api/data2'),
        axios.get('/api/data3')
      ]);

      results.forEach((result, index) => {
        if (result.status === 'fulfilled') {
          switch (index) {
            case 0:
              this.data1 = result.value.data;
              break;
            case 1:
              this.data2 = result.value.data;
              break;
            case 2:
              this.data3 = result.value.data;
              break;
          }
        } else {
          console.error(`Error fetching data for request ${index + 1}:`, result.reason);
        }
      });
    } catch (error) {
      console.error('Error fetching data:', error);
    }
  }
},
created() {
  this.fetchData();
}

通过这种方式,即使某个请求失败,其他请求的数据依然会被正确地处理。

Promise.all和Promise.allSettled是两种不同的Promise方法,它们在使用场景和返回结果上有所不同。 1. Promise.all: - 使用场景:当需要等待多个Promise对象都完成后再执行后续操作时,可以使用Promise.all。 - 返回结果:返回一个新的Promise对象,Promise对象在所有给定的Promise对象都已经fulfilled后才会fulfilled,如果其中任何一个Promise对象被rejected,则返回的Promise对象会立即被rejected。 - 示例代码: ```javascript const promise1 = Promise.resolve(1); const promise2 = Promise.resolve(2); const promise3 = Promise.resolve(3); Promise.all([promise1, promise2, promise3]) .then(values => { console.log(values); // 输出:[1, 2, 3] }) .catch(error => { console.log(error); // 如果有任何一个Promise对象被rejected,则会执行这里的代码 }); ``` 2. Promise.allSettled: - 使用场景:当需要等待多个Promise对象都完成后,无论是fulfilled还是rejected,都需要获取每个Promise对象的结果时,可以使用Promise.allSettled。 - 返回结果:返回一个新的Promise对象,该Promise对象在所有给定的Promise对象都已经fulfilled或rejected后才会fulfilled,返回的Promise对象带有一个对象数组,每个对象表示对应的Promise对象的结果,包括状态(fulfilled或rejected)和值。 - 示例代码: ```javascript const apiOne = function(id) { return new Promise((resolve, reject) => { resolve({ result: true, text: 1 }); }); }; const apiTwo = function(id) { return new Promise((resolve, reject) => { reject({ result: true, text: 2 }); }); }; Promise.allSettled([apiOne('one'), apiTwo('two')]) .then(results => { console.log(results); /* 输出: [ { status: 'fulfilled', value: { result: true, text: 1 } }, { status: 'rejected', reason: { result: true, text: 2 } } ] */ }) .catch(error => { console.log(error); }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值