首页 > 解决方案 > 过滤包含已解决 Promise 的对象数组

问题描述

我在这样的数组中有一堆对象:

let orders = [];
orders.push({
    name: 'name1',
    promise: promiseFunction(1),
    description: 'description1'
});
orders.push({
    name: 'name2',
    promise: promiseFunction(2),
    description: 'description2'
});

我之前等待每个 Promise 解决:

await Promise.allSettled(orders.map(order => order.promise));

效果很好。

但现在我想要一个数组,其中包含所有orders已解决的 Promise。我将如何过滤这个?伪代码我想到了这样的事情:

let successfullMainOrders = orders.filter(order => order.promise == 'resolved');

有没有好的方法来做到这一点?

提前致谢!

编辑:

添加一些上下文:我正在尝试尽快发送多个 REST 请求。这是通过使用请求结果解析或拒绝的函数来完成的。(promisefunction())因为我想尽可能快地提出这些请求,所以我的想法是首先将它们收集在一个数组中orders,其中包含一些附加信息以供以后识别namedescription并且在每个请求被解决/拒绝之后await Promise.allSettled(orders.map(order => order.promise));我想做仅使用来自成功请求的信息的进一步操作。

标签: javascriptnode.jspromise

解决方案


您现有的代码将不起作用,因为orders它是一个对象,而不是一个数组。你不能.push对一个对象。

要等待所有解析值并获得一个数组作为结果,该数组除了对象的其他部分之外还包含这些值,请.then在每个 Promise 之后放置一个以解析为数组中的一个对象,例如:

const orders = await Promise.all([
  promiseFunction(1).then(val => ({ name: 'name1', val, description: 'description1' })),
  promiseFunction(2).then(val => ({ name: 'name2', val, description: 'description2' })),
]);

如果您能够概括您的代码以使用名称、描述和promiseFunction参数的数组来调用,您可以减少它的重复性,也许像

const initialOrders = [
  { name: 'name1', arg: 1, description: 'description1' },
  { name: 'name2', arg: 2, description: 'description2' },
];
const orders = await Promise.all(
  initialOrders.map(
    ({ arg, ...rest }) => promiseFunction(arg).then(
      val => ({ ...rest, val })
    )
  )
);

推荐阅读