首页 > 解决方案 > 在 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

如您所见,数组中的第二个元素是空的,而它应该是一个整数,表示在数据库中找到了多少与法国相关的项目......我做错了什么?我知道数据库很大,可能没有足够的时间来加载它。有什么想法吗?

提前致谢 :)

标签: javascriptangularjs

解决方案


问题是您的数据调用是异步的,并且在您尝试将数据推送到数组之前尚未完成。

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

推荐阅读