【问题标题】:Use async instead of multiple await (Javascript)使用 async 而不是多个 await (Javascript)
【发布时间】:2023-03-10 04:05:02
【问题描述】:

我有以下 API 调用。 getA、getB 和 getC 是正在进行的 API 调用。由于我使用等待,这些是顺序调用。

如何使其异步并仅在所有调用完成后才返回结果。

handler: async function (request, h) {
                const headers = { headers: { “x-userId”: “sdsds” } };
                const getA = ( await getData("app/getA”)) || options.headers.STORES;
                const getB = ( await getData("app/getB”)) || [];
                const getC = ( await postData("app/getC”, { payload: {} }, headers)) || [];
                const result = {
                    status: "OK",
                    payload: {
                        stores: getA,
                        markets: getB,
                        groups: getC
                    }
                };
                return h.response(result);
            }

【问题讨论】:

  • 看起来这就是它已经编码的方式,您等待getDatapostData 调用的返回。您的实际结果与预期结果如何?
  • @DrewReese-同意。这些等待 getData 和 postData 的返回。但是当我们使用 await 时,它们不是按顺序执行的吗?我想让它异步,以便 getB 不必等待 getA 完成,而 getC 不必等待 getA 和 getB 完成。只有当所有 3 个调用都完成时才应该传递结果
  • 啊,我明白了,我误读了您尝试/要求做的事情。您想同时触发所有三个请求,并且仅在它们全部完成后才返回结果。

标签: javascript reactjs performance api async-await


【解决方案1】:

不确定这是否是您要找的...

IMO 使用 async/await 是一种很好的方法,因为您需要确保有效负载具有该数据,但我可能错了。

handler: function (request, h) {
    const headers = { headers: { 'x-userId': 'sdsds' } };
    const payload = {};

    getData('app/getA').then(data => {
        payload.stores = data;
    });

    getData('app/getB').then(data => {
        payload.markets = data;
    });

    getData('app/getC').then(data => {
        payload.groups = data;
    });

    const result = {
        status: "OK",
        payload,
    };
    return h.response(result);
}

【讨论】:

  • @mmason33- 我看到你让它异步了。但是结果变量如何知道之前进行的所有 3 次调用都已完成。 ?
  • 那是它不会的事情。这些异步块将在完成后完成,但这是用户要求的。
  • @mmason33- 抱歉,如果我不清楚。我同意您的代码会尽可能让异步块完成。但是如果 const 结果需要获取有效载荷。而在您的情况下,结果可能会在 AP 调用完成之前执行。我说的对吗>?
  • 是的,你是对的。要避免这种行为,请使用 async/await。
【解决方案2】:

您可以对您需要的三个值进行Promise.all。 Promise.all 接受一组承诺并返回一组已解决的响应。它们可以按任何顺序解决,但在 所有 个 promise 都解决之前,整个 promise 不会解决。

handler: async function (request, h) {
  const headers = { headers: { “x-userId”: “sdsds” } };

  const requests = [
    getData("app/getA”),
    getData("app/getB”),
    postData("app/getC”, { payload: {} }, headers))
  ];

  const [getA, getB, getC] = await Promise.all(requests);

  const result = {
    status: "OK",
    payload: {
      stores: getA || options.headers.STORES,
      markets: getB || [],
      groups: getC || [],
    }
  };

  return h.response(result);
}

注意:对于 Promise.all,如果任何一个 Promise 被拒绝,那么整个 Promise.all 都会被拒绝。 Promise.allSettled 在所有承诺都已履行或拒绝时解析。

【讨论】:

    猜你喜欢
    • 2018-12-01
    • 2019-08-17
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 2020-11-19
    相关资源
    最近更新 更多