【问题标题】:How to return value out of an asynchron function如何从异步函数中返回值
【发布时间】:2021-03-04 13:26:56
【问题描述】:

我有这个功能来检索数据,但我得到以下失败 留言:

未捕获的类型错误:无法读取未定义的属性“完成”。

看起来,返回功能不起作用。会很开心 寻求帮助。我仍然在回调函数方面遇到问题。

感谢您的帮助!

function getData(evt){
    fetch (evt)
    .then (function (response) {
        return response.json();
    });
}
getData("/getfile/xy").done(function(data){
    // do something
    console.log(data);
});

【问题讨论】:

    标签: fetch-api asynccallback


    【解决方案1】:

    您可以使用Asyncawait 方式:-

    async function getData(evt) {
      return await fetch (evt)
      .then (response => response.json())
      .then(data => {
        return data
      })
    }
    
    // retrieve it anywahere (this must be in an 'async' function to work)
    let dataRetrieved = await getData("/getfile/xy")
    

    【讨论】:

    • 代码运行良好,谢谢!我试过以下:code setInterval(getData("/getfile/xy"), 3000); code。但我得到一个承诺失败。我知道, setInterval 也适用于承诺/回调。你有什么建议,我如何让上面的代码在 setInterval 函数中工作?
    • 您使用setInterval 的原因是为了确保在指定的时间 内成功获取所有数据,对吗?如果是这样,那么即使不使用setInterval,上述方法(async await)也能做到这一点。变量dataRetrived 仅在获取完成后才会有数据。
    • 我想每 3 秒更新一次。在这个时间跨度内可以很好地获取数据。我发现,getData 被视为一种承诺,而不是一种功能。使用像`setInterval(function(){getData("/getfile/xy")}, 3000);`这样的匿名函数来解决问题
    • 是的。如果它解决了你的问题,那就太好了!将setInterval 设置为invoke3 秒 调用一次fetch 的函数将适用于您的代码setInterval(async() => await getData("/getfile/xy"), 3000)。你只需要让你仍然需要async await
    【解决方案2】:

    response.json() 也是一个异步操作,因此您需要将其视为一个承诺,如下所示:

    function getData(evt){
        fetch (evt)
        .then (function (response) {
            return response.json()
        }).then(function(data){
            console.log("DATA",data);
        })
    }
    

    【讨论】:

      猜你喜欢
      • 2020-07-29
      • 2022-01-14
      • 1970-01-01
      • 2017-12-16
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      • 2018-01-03
      相关资源
      最近更新 更多