访问外部数据库的问题For iterator

时间:2018-05-22 18:02:49

标签: javascript angularjs

我有一个名为 countriesData 的数组,用于存储各个国家/地区的名称,如下所示:

      [Germany,France,Canada,Austria,Switzerland,Spain]

我试图遍历该数组中的每个元素,其想法是在查询中使用每个国家/地区搜索外部API,然后在该外部API中保存项目的长度。简单来说,我会浏览每个国家/地区,并计算该国家/地区中有多少项目存储在外部数据库中。

我在循环之外访问数据库没有问题,但是,在for iterator中我无法访问它。这是我的代码:

    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 items 这是我在console.log obj后得到的一个例子:

    France,,2,Thriller, D'eux

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

提前致谢:)

1 个答案:

答案 0 :(得分:2)

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

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