【问题标题】:How to structure this async function to get a synchronous response如何构造此异步函数以获取同步响应
【发布时间】:2021-03-27 14:56:31
【问题描述】:

这是我的一些示例代码:

async function getAppState() {
  return {
    appState: {
      someBar: false
    }
  },
  async function req() {
    const resp = await fetch("https://www.example.com/script.php", {
      method: 'GET',
    })
    this.appState.someBar = await resp.json();
  }
}
let foo = await getAppState();
console.log(foo)

我希望能够填充appState 并将其作为参数传递给console.log,如我上面的示例所示。显然我正在做的事情不起作用。我试图表明我想以同步方式运行getAppState(),以便在调用函数后将fetch() 调用的结果转换为console.log。构建此代码的正确方法是什么?

【问题讨论】:

  • 您的代码格式错误 - 您的 getAppState 函数返回 req 函数
  • 你永远不会调用 req 函数。你为什么还要定义那个辅助函数?
  • async function 永远不会给您同步响应。但是,您可以编写它以在给出响应之前按顺序等待正确的内容。

标签: javascript promise async-await fetch


【解决方案1】:

我建议使用 .then 而不是等待承诺解决。 像这样:

let foo = getAppState();
foo.then(r=> console.log(r));

除此之外,我不知道有任何其他方法可以解决您的问题。

【讨论】:

    【解决方案2】:

    getAppState() 不需要是异步的。它只是一个对象构造函数,它本身并不执行fetch()。

    您需要使用await 调用req() 方法以等待fetch()。

    req 也需要在您要返回的对象中。

    function getAppState() {
      return {
        appState: {
          someBar: false
        },
        async req() {
          const resp = await fetch("https://www.example.com/script.php", {
            method: 'GET',
          })
          this.appState.someBar = await resp.json();
        }
      }
    }
    let foo = getAppState();
    await foo.req();
    console.log(foo.appState.someBar);

    【讨论】:

    • 运行此浏览器会引发异常(index):105 Uncaught SyntaxError: await is only valid in async function。这是await foo.req(); 表达式。
    • 所以让调用者异步。
    猜你喜欢
    • 2012-08-05
    • 2011-12-30
    • 2014-10-28
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多