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.
};