【问题标题】:How to export an object returned by async/await method如何导出 async/await 方法返回的对象
【发布时间】:2021-11-04 08:34:31
【问题描述】:

由于 Async 总是返回 Promise,我们必须解决它来获取值。我需要导出它的值(返回的对象),以便我们可以在另一个模块中使用它。

export const getClient = async () => {

  return await HttpService.getValueFromSettings('durl').then((response) => {
    if(isValidResponse(response)) {
        endpoint = response.data;
        export const client = createClient(response.data);
        //This is where getting error that we can not export in side the function
      }
    }
  })
}

我需要在另一个模块中使用客户端。

我尝试在调用之前声明并初始化客户端对象,但没有成功:

export let client = null;
export const getClient = async () => {
 return await HttpService.getValueFromSettings('durl').then((response) => {
    if(isValidResponse(response)) {
        endpoint = response.data;
        client = createClient(response.data);
        return client;
      }
    }
  })
}

【问题讨论】:

  • 为什么不创建一个方法并在每个需要的地方调用它?
  • 因为我必须通过 API 获取数据,而我需要使用的地方显示错误,因为他们不能等到方法返回结果。

标签: javascript asynchronous async-await


【解决方案1】:

我相当肯定你不能做你想做的事,至少不能直接做。

相反,您应该只导出 getClient() 函数本身,并在需要客户端时调用它。

import { getClient } from './myfile';

getClient().then(client => { someOtherFunction(client); });

importexport 被确定为同步的,因此您无法将它们与异步函数混合和匹配。

第二个示例的问题是您设置了client = null。当您稍后将其设置为一个对象时,您将该变量设置为一个对象,但您在导出时导出了client

【讨论】:

  • 我试过了,问题是我需要使用 getClient 的地方需要某些对象。此外,getClient 返回 Promise 对象并引发编译错误,我尝试在某处分配。
  • @TechTurtle 在这种情况下,您的问题无法解决,因为您正在尝试转换异步代码以使其同步运行。
  • @TechTurtle 在这种情况下,您需要重新设计一些东西,并且可能还需要将其他东西包装在 Promise 中。 JavaScript 没有强制异步代码同步的机制(除了做一些非常丑陋的事情,比如强制循环,但这样做时会冻结整个窗口)。 awaitasync 实际上只是 Promise 的语法糖。它们没有提供任何根本性的新功能。
  • @Marklar 您可以将值设置为其范围内的任何变量,其中包括顶级文件变量,所以是的。在尝试使用它之前,您只需要确保您知道 promise 是否已经解决(通常只需检查它是否为 null/undefined 就足够了)。
  • @Marklar 是的,如果没有解决,您需要每次调用ourMethod(),直到解决为止。您可以在 else 中使用 setTimeout() 执行此操作,然后在 x 秒内再次尝试,或者您可以让您的 .then() 直接调用它,具体取决于您的设置。
【解决方案2】:

现在可以在现代浏览器中使用Top level await。请务必在示例下方的表格中检查浏览器支持。

一个使用从 MDN 获取的简单示例:

const colors = fetch('../data/colors.json')
  .then(response => response.json());

export default await colors;

原始脚本可以如下编写并按 OP 预期工作:

const client = HttpService.getValueFromSettings('durl').then((response) => {
  if(isValidResponse(response)) {
    return createClient(response.data);
  }
  return null;
};

export default await client;

【讨论】:

  • 虽然 vs 代码警告我 await 对导出没有影响,但它确实...谢谢!!
猜你喜欢
  • 2016-12-12
  • 2014-11-01
  • 1970-01-01
  • 2019-09-13
  • 2017-01-03
  • 2019-10-05
  • 1970-01-01
  • 2021-08-06
  • 2019-03-01
相关资源
最近更新 更多