javascript - 从 fetch 将数据加载到变量中时出错
问题描述
我正在尝试仅使用 JS/HTML/CSS(无框架)构建网页,但是当尝试将响应分配给变量时,似乎流程不是我写的顺序:
var COUNTRIES_DATA = "";
function fetchCountriesData(){
fetch(`${API_URL}/countries`).then(response => {
return response.json().then(countries => {
COUNTRIES_DATA = countries;
});
});
};
fetchCountriesData();
renderCountriesCombo(COUNTRIES_DATA);
function renderCountriesCombo(countries) {
countries.sort(function (a, b) {
return (a.Country > b.Country) ? 1 : ((b.Country > a.Country) ? -1 : 0);
});
let options = countries.map(country => {
return `<option>${country.Country}</option>`
})
document.getElementById("combo").innerHTML = options;
}
我收到的错误消息是countries.sort is not a function
,但是当我调试变量中国家的值时,renderCountriesData()
它countries
是空的。
断点在 ->
fetch('${API_URL}/countries').then
fetchCountriesData();
countries.sort(function (a, b) {
我调试时的流程如下:
开始fetchCountriesData()
- > 因为我有一个<body onload="fetchCountriesData()">
函数签名(第一行),不运行该return
方法,接下来它转到renderCountriesCombo()
函数并给出错误消息,然后返回fetchCountriesData()
并填充COUNTRIES_DATA
.
问题是,我需要COUNTRIES_DATA
在任何其他方法运行之前填充该变量。
解决方案
fetch()
是网络承诺,在调用承诺后,renderCountriesCombo 立即执行,同时数据正在获取,未完成。
你应该这样做:
fetchCountriesData().then(countries => renderCountriesCombo(countries))
推荐阅读
- vmware - 服务条款——或者我可以在我的网站上分发“免费”软件的副本吗?
- python - 试图检测鼠标点击
- xslt-2.0 - 为后续 xslt 2 处理转义文本
- java - 使用反射的 avro SpecificRecord 的 KafkaConsumer 泛型类型
- python - python scapy.all 文件未找到
- javascript - 将 DevTool 的网络流量输出打印到网页
- python - 使用 writerow 存储变量数据的问题
- git - Pycharm GUI 添加文件到 .gitignore 菜单项消失
- python - 在 python 中使用 Gym 来模拟 Reinforcement ML 的机械臂
- sql - 根据 JSONB 第一个值按查询排序组