TypeScript 结合多个 Promise 等待

发布于 2025-01-20 23:54:52 字数 602 浏览 1 评论 0原文

我基本上有一个代码,其中我有一个变量,可以合并多个承诺等待,并将它们凝结到一个对象中

const traversals = (await traverseSchemas({filename:"my-validation-schema.json"}).concat([
      _.zipObject(
        ["id-1", "id-2"],
        [
          await loadSchema({
            filename: "schema-1.json"
          }),
          await loadSchema({
            filename: "schema-2.json"
          }),
        ]
      ),
    ]);  

travereschemas返回数组对象[{“ key1”:{object}}}:{object}}} ,{“ key2”:{object}}]

我正在探索我是否可以在travers级别上应用等待,只是以获取所有应许的满足数据或是否有任何保证重构代码的更好方法。

I have basically a piece of code where I have a variable that consolidates multiple promise awaits and concat them into a single object

const traversals = (await traverseSchemas({filename:"my-validation-schema.json"}).concat([
      _.zipObject(
        ["id-1", "id-2"],
        [
          await loadSchema({
            filename: "schema-1.json"
          }),
          await loadSchema({
            filename: "schema-2.json"
          }),
        ]
      ),
    ]);  

The traverseSchemas returns an array object [{"key1":{object}}, {"key2": {object}}]

I am exploring if there is a away I can apply await at traversals level only to get all the promised fulfilled data or if there is any better way to refactor the code.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

淡水深流 2025-01-27 23:54:52

因为没有一个 Promise 依赖于另一个 Promise 的结果,所以您可以使用 Promise.all 同时(并行)执行所有 Promise。这只使用单个 await ,并且 return ... 是一个结合等待值的纯同步表达式 -

async function traversals() {
  const [validation, schema1, schema2] = await Promise.all([
    traverseSchemas({filename:"my-validation-schema.json"}),
    loadSchema({filename: "schema-1.json"}),
    loadSchema({filename: "schema-2.json"}),
  ])

  return [
    ...validation,
    _.zipObject(["id-1", "id-2"], [schema1, schema2])
  ]
}

如果您有权访问顶级 await code> 或者这已经是另一个 async 函数的一部分,您可以定义 const traversals = ... 而不是使用 return -

const [validation, schema1, schema2] = await Promise.all([
  traverseSchemas({filename:"my-validation-schema.json"}),
  loadSchema({filename: "schema-1.json"}),
  loadSchema({filename: "schema-2.json"}),
])

const traversals = [
  ...validation,
  _.zipObject(["id-1", "id-2"], [schema1, schema2])
]

Because no promise depends on the result of another, you can execute all of them simultaneously (in parallel) using Promise.all. This only utilizes a single await and the return ... is a purely synchronous expression combining the awaited values -

async function traversals() {
  const [validation, schema1, schema2] = await Promise.all([
    traverseSchemas({filename:"my-validation-schema.json"}),
    loadSchema({filename: "schema-1.json"}),
    loadSchema({filename: "schema-2.json"}),
  ])

  return [
    ...validation,
    _.zipObject(["id-1", "id-2"], [schema1, schema2])
  ]
}

If you have access to top-level await or this is already part of another async function, you can define const traversals = ... instead of using return -

const [validation, schema1, schema2] = await Promise.all([
  traverseSchemas({filename:"my-validation-schema.json"}),
  loadSchema({filename: "schema-1.json"}),
  loadSchema({filename: "schema-2.json"}),
])

const traversals = [
  ...validation,
  _.zipObject(["id-1", "id-2"], [schema1, schema2])
]
情泪▽动烟 2025-01-27 23:54:52

有很多选择。

通常,普通代码更容易理解。因此,我会去做这样的事情:

const validationSchemas = await traverseSchemas({ filename:"my-validation-schema.json" })
const schema1 = { "id-1": await loadSchema({ filename: "schema1-json" });
const schema2 = { "id-2": await loadSchema({ filename: "schema2-json" });

const traversals = [ ...fetchedSchemas, schema1, schema2 ];

如果您想并行等待等待,可以先准备它们,然后通过 promise.all ,然后加入:

const tasks = [
    traverseSchemas({ filename:"my-validation-schema.json" }),
    loadSchema({ filename: "schema1-json" }),
    loadSchema({ filename: "schema2-json" })
];

const [validationSchemas, schema1Value, schema2Value] = await Promise.all(tasks);

const traversals = [
    ...validationSchemas,
    { 'id-1': schema1Value },
    { 'id-2': schema2Value }
];

There are many options.

Typically plain code is easier to understand. So I would go for something like this:

const validationSchemas = await traverseSchemas({ filename:"my-validation-schema.json" })
const schema1 = { "id-1": await loadSchema({ filename: "schema1-json" });
const schema2 = { "id-2": await loadSchema({ filename: "schema2-json" });

const traversals = [ ...fetchedSchemas, schema1, schema2 ];

If you want to parallelize awaits, you could prepare them first, then request via Promise.all and then join together:

const tasks = [
    traverseSchemas({ filename:"my-validation-schema.json" }),
    loadSchema({ filename: "schema1-json" }),
    loadSchema({ filename: "schema2-json" })
];

const [validationSchemas, schema1Value, schema2Value] = await Promise.all(tasks);

const traversals = [
    ...validationSchemas,
    { 'id-1': schema1Value },
    { 'id-2': schema2Value }
];
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文