Javascript 从获取返回的未定义值(承诺)

Javascript 从获取返回的未定义值(承诺),javascript,html,promise,Javascript,Html,Promise,我想我没有正确理解承诺。我的理解是,fetch()返回一个承诺,我尝试使用.then()返回承诺中的值,但我总是未定义。另外让我困惑的是,我可以console.log()并显示数据,但当我尝试在其他地方使用它时,它返回undefined。我做错了什么 var getData = function(){ var getRaceData = function() { fetch('http://ergast.com/api/f1/2008.json')

我想我没有正确理解承诺。我的理解是,
fetch()
返回一个承诺,我尝试使用
.then()
返回承诺中的值,但我总是未定义。另外让我困惑的是,我可以
console.log()
并显示数据,但当我尝试在其他地方使用它时,它返回
undefined
。我做错了什么

var getData = function(){

    var getRaceData = function()
    {
        fetch('http://ergast.com/api/f1/2008.json')
        .then(function(response) {
            response.json().then(function(data) {
                var raceSeason = data.MRData.RaceTable; 
                var raceData = raceSeason.Races;
                console.log(raceData);
                // Not returning racedata here, always get undefined
                return raceData;
            });
            }
        )
        .catch(function(err) {
            return;
        });
    }


}

您需要返回调用
response.json()的结果。然后(…)
。通常,您会通过链接第一个
,然后链接
的结果而不是嵌套(嵌套有它的用途,但这里可能没有)。您还需要返回整个链(假设数据应该离开
getRaceData
):


不过,还有几点需要注意:

  • 您没有检查HTTP错误。这是
    fetch
    API中的一个footgun,它只拒绝网络错误,而不是HTTP错误。相反,您必须添加一张支票

  • 理想情况下,您应该报告或以其他方式处理拒绝,而不是让它默默地失败。:-)

  • getData
    中的代码只创建一个函数,不调用它。但我想你是在用你没有显示的代码调用它

  • 因此:


    getRaceData
    没有
    return
    语句。只有
    然后
    回调才可以。@Quentin-谢谢,好眼力。出于某种原因,我认为它是内联使用的,但是内部的
    return raceData
    不会被调用。
    getRaceData
    没有return语句,因此它总是返回
    未定义的
    。传递给
    然后
    catch
    的函数是不同的函数。
    var getData = function(){
    
        var getRaceData = function()
        {
            return fetch('http://ergast.com/api/f1/2008.json')
            .then(function(response) {
                return response.json();
            }).then(function(data) {
                var raceSeason = data.MRData.RaceTable; 
                var raceData = raceSeason.Races;
                console.log(raceData);
                return raceData;
            })
            .catch(function(err) {
                return;
            });
        }
    }
    
    var getData = function(){
        var getRaceData = function()
        {
            fetch('http://ergast.com/api/f1/2008.json')
            .then(function(response) {
                if (!response.ok) {
                    throw new Error("HTTP error " + response.status);
                }
                return response.json();
            }).then(function(data) {
                var raceSeason = data.MRData.RaceTable; 
                var raceData = raceSeason.Races;
                console.log(raceData);
                return raceData;
            })
            .catch(function(err) {
                // ...report/handle the error...
            });
        };
        // Presumbly use `getRaceData` here; the code above only *defines* it.
    };