>source

데이터를 받기 위해 사용하는 API에 대한 호출이 본질적으로 다른 함수 사전이 있습니다 (약속). API가 데이터를 구조화 한 방식으로 각 국가에서 모든 종을 얻으려면 키워드 q 를 사용하여 https 요청을 수정하는 API를 호출해야합니다.  각 국가마다 다릅니다. sp_b_c 라는 사전 내에 함수를 만들었습니다. 국가 별 종을 의미합니다. 그것은 q 걸립니다 이 국가는 통화 자체가 해당 국가 내 모든 종의 약속 가치가있는 약속을 반환합니다.

사전에서 다른 함수를 만들어 각 국가의 모든 종을 잡아서 나중에 사용할 수 있도록 만들려고합니다.

내가 시도한 것은 sp_b_c_all 라는 새로운 함수를 만드는 것입니다. . 내 country_list 에 전화를 걸  모든 국가를 얻기 위해 사전에 기능. 그런 다음 각 국가를 반복하고 각 국가를 함수 sp_b_c 에 전달합니다. . 배열 sp_b_c_entire 를 만들었습니다  그것은 약속의 세계처럼 행동합니다. 왜냐하면 모든 약속은 국가를 반복하고 각 국가를 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 의 각 국가를 반복합니다. 그런 다음 accesses.sp_b_c 에 대한 API 호출에 각 국가를 전달합니다. 국가 매개 변수와 함께. 이로부터 약속을 받아 배열에 저장하고 싶습니다.

내가 잘못한 것은 무엇이며 어떻게 해결할 수 있습니까? 어쩌면 내 프로세스를 어떻게 변경해야합니까?


  • 답변 # 1

    country_li 인 경우  약속을 반환하는 함수이므로 약속을 얻으려면 먼저 호출해야합니다.

    country_li().then(function(countries) {...})
    
    

관련 자료

  • 이전 memory - memtest 결과를 기반으로 캐시 대기 시간을 계산할 수 있습니까?
  • 다음 python - 명령을 통해 쉽게 임베드하는 방법이 있습니까? | discordpy 재 작성