javascript - 从 fetch 返回的值 undefined (promise)
问题描述
我认为我没有正确理解承诺。我的理解是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().then(...)
。通常,您会通过链接 firstthen
的结果而不是嵌套来做到这一点(嵌套有其用途,但可能不在这里)。您还需要返回整个链(假设数据应该离开getRaceData
):
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;
});
}
}
不过,还有一些其他注意事项:
您没有检查 HTTP 错误。这是
fetch
API 中的枪,它只拒绝网络错误,而不是 HTTP 错误。相反,您必须添加支票。理想情况下,您会报告或以其他方式处理拒绝,而不是让它默默地失败。:-)
中的代码
getData
只创建一个函数,它不调用它。但我假设您是在未显示的代码中调用它。
所以:
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.
};
推荐阅读
- c++ - 我在行 head=NULL 中收到分段错误错误
- replace - Smarty 替换多个可以相互包含的值
- java - 如何通过键集对地图进行排序?
- amazon-s3 - passwd 文件中同一存储桶的多个条目(默认)
- ios - 将两个数字相除并快速返回分数
- bash - 如何打印文件中包含指定字节偏移的整行?
- jestjs - 如何测试选择器中的所有孩子,除了 Jest 中的第一个孩子
- wpf - 如何获取 DataGridTextColumn 的默认 ControlTemplate?
- java - 如何使用 LeakCanary 修复“在 Activity 实例中发现泄漏”
- r - r中某些时间序列的AR模型错误