javascript - 在 For 迭代器中访问外部数据库时出现问题
问题描述
我有一个名为countriesData的数组,它存储各个国家/地区的名称,如下所示:
[Germany,France,Canada,Austria,Switzerland,Spain]
我正在尝试遍历该数组中的每个元素,其想法是通过外部 API 在查询搜索中使用每个国家/地区,然后将项目的长度保存在该外部 API 中。简单地说,我遍历每个国家并计算该国家有多少项目存储在外部数据库中。
我在循环外访问数据库没有问题,但是,在 for 迭代器内我无法访问它。这是我的代码:
for (var iter = 0; iter < countriesData.length; iter++) {
var obj = [];
var country = countriesData[iter]
var items;
var itemsCountry = 0;
$http.get("https://api.discogs.com/database/search?q={?country==" + country + " }&token=zwxZExVZTenjPTKumVeTDVRuniqhQLAxymdzSxUQ").then(function(response) {
items = response.data.pagination.items;
})
var str = "";
obj.push(countriesData[iter]);
obj.push(items);
for (var J = 0; J < myStats.data.length; J++) {
if (myStats.data[J].country == countriesData[iter]) {
itemsCountry++;
str += myStats.data[J].title + ", ";
}
}
obj.push(itemsCountry);
var str2 = str.substring(0, str.length - 2);
obj.push(str2);
newData.push(obj);
console.log("new obj : " + obj)
}
基本上,我需要根据来自http.get的响应数据的长度来更新var项目 这是我在 console.log obj 后得到的一个示例:
France,,2,Thriller, D'eux
如您所见,数组中的第二个元素是空的,而它应该是一个整数,表示在数据库中找到了多少与法国相关的项目......我做错了什么?我知道数据库很大,可能没有足够的时间来加载它。有什么想法吗?
提前致谢 :)
解决方案
问题是您的数据调用是异步的,并且在您尝试将数据推送到数组之前尚未完成。
function getCountryData(country) {
var obj = [];
var items;
var itemsCountry = 0;
$http.get("https://api.discogs.com/database/search?q={?country==" + country + " }&token=zwxZExVZTenjPTKumVeTDVRuniqhQLAxymdzSxUQ").then(function(response) {
items = response.data.pagination.items;
var str = "";
obj.push(country);
obj.push(items);
for (var J = 0; J < myStats.data.length; J++) {
if (myStats.data[J].country == countriesData[iter]) {
itemsCountry++;
str += myStats.data[J].title + ", ";
}
}
obj.push(itemsCountry);
var str2 = str.substring(0, str.length - 2);
obj.push(str2);
newData.push(obj);
console.log("new obj : " + obj)
})
}
for (var iter = 0; iter < countriesData.length; iter++) {
var country = countriesData[iter];
getCountryData(country);
}
推荐阅读
- c# - Parallel.ForEach() 是否在执行后立即销毁线程?
- javascript - doc.fromHTML 不是函数
- reactjs - 反应中的千位分隔符输入类型数(JSX)
- c - 如何处理 SIGSEGV,Segmentation fault。使用 Avx2 时
- django - “rest_framework CSRF token failed”,但它已经在请求标头中设置为“X-CSRF-Token”
- elasticsearch - elasticdump安装问题:async _loop Unexpected identifier error
- ios - ipa 文件的校验和
- node.js - 'private: true' 和 'lsd: false' 未被识别为有效的 torrent 选项,不允许将 torrent 转换为私有。节点JS | 网络洪流
- flutter - 有没有办法在颤振桌面应用程序中卸载通过 loadFontFromList 加载的字体?
- php - 如何为贝宝重复付款创建 RestAPI?