Javascript: словарь функций; одна функция в словаре вызывает другую - PullRequest
2 голосов
/ 07 мая 2019

У меня есть словарь функций, которые по сути являются различными вызовами API, который я использую для получения данных (в обещаниях). То, как мой API структурировал свои данные, чтобы получить все виды из каждой страны, я должен позвонить в API, модифицируя запрос https, используя ключевое слово q, специфичное для каждой страны. Я создал функцию в словаре под названием sp_b_c, что означает вид по стране. Требуется q, то есть страна, в которой сам вызов возвращает обещание со значением обещания всех видов в этой стране.

Я хочу создать еще одну функцию в словаре, которая позволила бы мне собирать все виды из каждой страны, чтобы все они содержались для последующего использования.

Я попытался создать новую функцию с именем sp_b_c_all. Я выполняю вызов функции country_list в словаре, чтобы получить все страны. Затем я перебираю каждую страну и передаю каждой стране функцию sp_b_c. Я создал массив sp_b_c_entire, который по существу действует как Promise.all, потому что все обещания, полученные путем итерации по странам и передачи каждой страны в вызов для sp_b_c, приводят к возвращаемому обещанию.

Однако при совершении этого звонка getData("accesses", "sp_b_c_all")], Я получаю следующую ошибку:

script.js:38 Uncaught TypeError: country_li.then is not a function
    at Object.accesses.sp_b_c_all (script.js:38)
    at getData (script.js:68)
    at initialization (script.js:194)
    at script.js:365

Ниже приведен код, на который ссылается:

var getData = function(set, target, q, ...manyMore) {
  var pack = [];
  // ~ USE rest parameters instead, grab array from ...

  // set accesses
  var api_token = "9d34bf3f79ae6a8b88c4f1f54ffc3e64e5f4cdcc2cc47bd1cf429e7e247d94b2";
  var accesses = new Object();
  var alternative = new Object();

  // ~ do a promise all, might be overload for API, so limitations
  if (set == "accesses") {
   accesses.sp_b_c = function(q) {
     return d3.json("https://apiv3.iucnredlist.org/api/v3/country/getspecies/"+ q +
     "?token=9d34bf3f79ae6a8b88c4f1f54ffc3e64e5f4cdcc2cc47bd1cf429e7e247d94b2")
     .then(function(d) { return d; });
   }

   accesses.sp_b_c_all = function() {
     sp_b_c_entire = [];
     console.log(accesses.sp_b_c("AE"))
     var country_li = accesses.country_list;
     country_li.then(function(countries) {
       console.log(countries);
       countries.forEach(function(country) {
         sp_b_c_entire.push(accesses.sp_b_c(country));
       })
    })
    return sp_b_c_entire;
  }

   accesses.country_list = function() {
     return d3.json("https://apiv3.iucnredlist.org/api/v3/country/list?token="+api_token)
              .then(function(d) { return d; });
   }
   accesses.comp_group_list = function() {
     return d3.json("https://apiv3.iucnredlist.org/api/v3/comp-group/list?token="+api_token)
              .then(function(d) { return d; });
   }
   accesses.comp_group_specific = function() {
     return d3.json("https://apiv3.iucnredlist.org/api/v3/comp-group/getspecies/"+ key +"?token="+api_token)
              .then(function(d) { return d; });
   }
   accesses.threats_regional = function() {
     return d3.json("http://apiv3.iucnredlist.org/api/v3/threats/species/name/Ursus%20maritimus/region/europe?token="+api_token)
              .then(function(d) { return d; });
   }
   accesses.threats_global = function() {
     return d3.json("http://apiv3.iucnredlist.org/api/v3/threats/species/name/Loxodonta%20africana?token="+api_token)
              .then(function(d) { return d; });
   }

   return accesses[target]();
 }
  // alternative threat dataset
  else if (set == "csv") {
    var data = d3.csv(target + ".csv");
    var transformation = data.then(
      function(d) {
        var container = d.map(function(d) {
        return {s_n: d.ScientificName,
                c_n: d.CommonName,
                state: d.States,
                group: d.group};
        });
        pack.push(container);
      } // end of anon/callback function
    ); // end of then function
  return data;
  } // end of else if conditional


};

Я думал, что если я позвоню accesses.country_list из accesses.sp_b_c_all, я получу обещание для списка стран. Затем я использую then() для доступа к значению обещания. Внутри then(countries) страны - это набор данных (список стран. Здесь я использую цикл forEach для итерации по каждой стране в countries, а затем я передаю каждую страну в вызов API для accesses.sp_b_c с параметр страны. Отсюда я надеюсь получить обещание, а затем сохранить его в массиве.

Что я делаю не так и как я могу это исправить? Как я должен изменить мой процесс, хотя?

1 Ответ

1 голос
/ 07 мая 2019

Если country_li - это функция, которая возвращает обещание, вам нужно сначала вызвать его, чтобы получить это обещание:

country_li().then(function(countries) {...})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...