【问题标题】:returning JSON from javascript fetch从 javascript fetch 返回 JSON
【发布时间】:2020-02-29 21:58:28
【问题描述】:

我正在尝试学习如何用 async 和 await 替换回调函数。两天后,我进行了以下工作,它将json从函数内部写入控制台。

const requestRoster = async ()=> {
    const response = await fetch('/testing/getRoster.php', {
        method: 'get',
        headers: {
            'Content-Type': 'application/json'
        }
    })
    const json = await response.json()
    console.log(json); // writes the array json to the console
    return json; //apparently returns a pending promise
}



然而,当我说

$roster = requestRoster();
console.log ($roster); // writes Promise{<pending}> to the console
​

控制台报告

承诺{} 当我展开这条线时,我看到:

Promise {<pending>}
__proto__: Promise
[[PromiseStatus]]: "resolved"
[[PromiseValue]]: Array(64)

并且 Array(64) 包含我想要的数据。

显然我在这里有点迷路了。显然,函数 requestRoster() 正在返回一个未决的承诺。 我想要的是它返回 Array(64)。那么,我哪里错了?我只是想让 requestRoster() 返回 Array(64)

谢谢,

【问题讨论】:

标签: javascript es6-promise fetch-api


【解决方案1】:

async 声明的函数返回一个承诺,即使您返回一个简单的值。如果你返回这样一个值,它会被包装到一个已经解析的 Promise 中,你可以读出已知的方法。

如果你在另一个异步函数中,你可以等待它。

$roster = await requestRoster();

在简单的函数或箭头函数中,您可以使用 promise 方法。

requestRooster().then( (roster) => { /* do something with rooster*/ } );

【讨论】:

    【解决方案2】:

    当您使用async 关键字时,该函数会自动返回Promise

    await关键字用于等待promise解决。

    你可以很容易地做到这一点:

    $roster = await requestRoster();
    

    但请注意,这只能在 async 本身的函数中完成。如果你想在顶层使用它,你可以像这样使用 IIFE(立即调用函数表达式):

    (async () => {
      $roster = await requestRoster();
      // do something with $roster here
    })();
    

    【讨论】:

      【解决方案3】:

      只需从该行中删除 await

      const json = await response.json()
      

      【讨论】:

      • 这不会改变任何事情。实际上需要awaitresponse.json()Promise
      • await 解决了承诺——这是预期的行为。你想通过删除它来实现什么?
      猜你喜欢
      • 2021-03-08
      • 2017-09-13
      • 2021-11-22
      • 1970-01-01
      • 2018-07-18
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      • 2017-03-28
      相关资源
      最近更新 更多