Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:函数字典;字典中的一个函数调用另一个函数_Javascript_Arrays_Function_Object_Ecmascript 6 - Fatal编程技术网

Javascript:函数字典;字典中的一个函数调用另一个函数

Javascript:函数字典;字典中的一个函数调用另一个函数,javascript,arrays,function,object,ecmascript-6,Javascript,Arrays,Function,Object,Ecmascript 6,我有一个函数字典,这些函数本质上是对我用来接收数据的API的不同调用(在promises中)。按照我的API构建数据的方式,为了从每个国家获取每个物种,我必须调用API修改https请求,使用每个国家特有的关键字q。我在字典中创建了一个名为sp_b_c的函数,意思是按国家划分的物种。它接受一个q,即国家/地区,调用本身返回一个承诺,承诺值为该国家/地区内的所有物种 我想在字典中创建另一个函数,它允许我从每个国家抓取所有物种,以便包含所有物种供以后使用 我试图做的是创建一个名为sp_b_c_all

我有一个函数字典,这些函数本质上是对我用来接收数据的API的不同调用(在promises中)。按照我的API构建数据的方式,为了从每个国家获取每个物种,我必须调用API修改https请求,使用每个国家特有的关键字
q
。我在字典中创建了一个名为
sp_b_c
的函数,意思是按国家划分的物种。它接受一个
q
,即国家/地区,调用本身返回一个承诺,承诺值为该国家/地区内的所有物种

我想在字典中创建另一个函数,它允许我从每个国家抓取所有物种,以便包含所有物种供以后使用

我试图做的是创建一个名为
sp_b_c_all
的新函数。我调用字典中的
country\u list
函数以获取所有国家/地区。然后我遍历每个国家并将每个国家传递到函数
sp_b_c
。我创建了一个数组
sp_b_c_intelling
,它本质上就像一个Promise.all,因为通过遍历国家并将每个国家传递到调用
sp_b_c
得到的所有承诺都会导致一个返回的承诺

但是,在进行此调用时,
getData(“access”、“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


};
我原以为,如果我从
access.sp_b_c_all
内部打电话
access.country_list
,我会收到国家列表的承诺。然后我利用
then()
访问承诺值。在
然后(国家)
的内部,国家是数据集(国家列表。在这里,我使用forEach循环迭代
国家中的每个国家,然后我将每个国家传递到api调用中,以使用country参数访问
sp_b_c
。我希望从中接收承诺,然后将其存储在数组中


我做错了什么?我应该如何解决这个问题?我应该如何改变我的进程,也许?

如果
country\u li
是一个返回承诺的函数,您需要首先调用它以获得该承诺:

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

所以说,
访问.country\u li
我只是获取了存储在其中的函数,而没有调用它?是的,就是@MichaelRamage-
类型的country\u li==“function”