【问题标题】:Result Is Accessible Inside Function With `fetch`, But Pending When Returned [duplicate]结果可通过`fetch`在函数内部访问,但在返回时挂起[重复]
【发布时间】:2021-05-19 22:34:18
【问题描述】:

我们正在尝试从 GET 请求中获取响应 JSON。

当我们从 get 函数内部打印 result 时,JSON 会像您期望的那样打印出来。

但是,当我们返回它并然后尝试打印它时,我们得到一个 Promise 卡在 <pending> 上。

下面是我们的代码:

"use strict";

async function get(url) {
    let response = await fetch(url);

    if (!response.ok) {
        throw new Error(`An error occured: ${response.status} ${response.statusText}`);
    }

    let result = await response.json();

    console.log("result inside function", result);
    return result;
}

let url = "OUR_URL";
let result = get(url);
console.log("result outside function: ", result);

下面是输出:

result outside function:  Promise {<pending>}
result inside function {success: true, statusCode: 200}

根据上面输出语句的顺序,尽管函数内部有await,但外部代码在函数内部代码被解析之前首先执行。 不幸的是,外部代码不在async 函数中,所以它不能使用await

但是,当我们在函数外使用then() 时,我们能够得到很好的响应:

get(url).then(result => {
    console.log("result outside function, inside then: ", result);
});

下面是输出:

result inside function {success: true, statusCode: 200}
result outside function, inside then:  {success: true, statusCode: 200}

以上,输出语句的顺序与预期一致,内部语句先执行,然后外部语句执行。

我们已经看到了this answer,但它并没有在 JavaScript 上为我们点击。

我们有三个问题:

  1. JavaScript 到底在做什么?

  2. 有没有办法在函数之外获得响应而不必使用then()

    2.1。如果上面的答案是否定的,有没有办法从.then() 内部获取响应并将其暴露在外部?

【问题讨论】:

  • 你必须await你的电话到get
  • 您需要了解阻塞/非阻塞代码以及执行堆栈。在代码中的上述函数上使用异步不会自动使下面的代码等待它完成。异步代码是在它完成工作时简单地引用并推到一边,js继续并移动到下一行代码..
  • @Evert 啊,是的。我们在 OP 中注意到我们已经看到了该答案,但是当我们发布问题时,它并没有完全在 JavaScript 中为我们点击。感谢您提出这个问题!

标签: javascript async-await fetch-api


【解决方案1】:

你需要awaitget函数。另外,请注意,如果您不重新分配变量,请使用 const

async function get(url) {
    const response = await fetch(url);

    if (!response.ok) {
        throw new Error(`An error occured: ${response.status} ${response.statusText}`);
    }

    const result = await response.json();

    console.log("result inside function", result);
    return result;
}

(async () => {
  const url = "OUR_URL";
  const result = await get(URL);
  console.log("result outside function: ", result);
})();

【讨论】:

  • 我明白了,但是用async 包装外部调用似乎与使用then() 相同,因为结果只能在所述包装内访问。有没有办法将结果暴露给外部,非异步/然后代码?
  • 很遗憾,目前还没有,但top-level await 是包含在 JavaScript 规范中的第 3 阶段候选对象。
  • 啊,我希望有一天能实现!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 2015-02-24
相关资源
最近更新 更多