You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaScript中为带字符串标签的Promise数组使用Promise.all?

解决Promise.all保留标签的问题

首先你原代码里的Promise创建存在问题:new Promise(() => {this.repository.getRepository<a.entity>.find()})完全没必要手动包裹一层Promise——find()方法本身就会返回Promise,而且你这种写法没有正确resolve结果,会导致Promise永远无法完成。

要保留实体名称标签,正确的思路是让每个Promise完成后,返回**[实体名称, 查询结果]**的数组。这样用Promise.all处理后,就能直接得到你想要的结构。

修正后的代码如下:

// 构建Promise数组,每个Promise resolve后返回[实体名称, 查询结果]
const promiseArray = array.map(a => {
  // 直接调用find()返回的Promise,通过then把结果和名称绑定
  return this.repository.getRepository(a.entity).find()
    .then(result => [a.entityName, result] as [string, unknown[]]);
});

// 用Promise.all处理,直接得到带标签的结果数组
try {
  const result = await Promise.all(promiseArray);
  console.log(result);
  // result结构正是你需要的:[['EntityName', [{},{}]], ['EntityName2', [{},{}]]]
} catch (e) {
  console.error(e);
}

为什么之前的方法无效?

  • 直接把[string, Promise]数组传给Promise.all:Promise.all会等待数组内每个元素,但字符串不是Promise,会直接resolve为原字符串,最终结果会是[['EntityName', Promise], ['EntityName2', Promise]],完全不符合预期。
  • 用promiseArray.map(pm => pm[1]):虽然能拿到所有Promise,但丢失了对应的实体名称,因为map后只剩下孤立的Promise数组,没有关联标签。

额外类型优化(可选)

如果需要更严谨的类型定义,可以给结果指定类型:

type EntityResult = [string, Record<string, unknown>[]];
const result: EntityResult[] = await Promise.all(promiseArray);

内容的提问来源于stack exchange,提问作者Mamochi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 23:48:23