javascript - Javascript:函数字典;字典中的一个函数调用另一个函数
问题描述
我有一个函数字典,它们本质上是对我用来接收数据的 API 的不同调用(在承诺中)。我的 API 构建其数据的方式,为了从每个国家/地区获取每个物种,我必须使用q
特定于每个国家/地区的关键字调用 API 修改 https 请求。我在字典中创建了一个名为 的函数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
,然后我将每个国家传递给accesses.sp_b_c
带有国家参数的 api 调用。由此,我希望收到一个承诺,然后将其存储在数组中。
我做错了什么,我该如何解决这个问题?也许我应该如何改变我的过程?
解决方案
ifcountry_li
是一个返回 promise 的函数,你需要先调用它来获得这个 promise:
country_li().then(function(countries) {...})
推荐阅读
- android - Jetpack Compose:当带有 GlideImage 的元素在 LazyColumn 中可点击时出现性能问题
- javascript - 从 SvelteKit load() 函数导出道具
- python - AttributeError:“google.protobuf.pyext._message.RepeatedCompositeCo”对象没有属性“DESCRIPTOR”
- excel-formula - Excel:如何在字符串中找到六种不同的单词组合?
- navigation - 当我尝试在智能手机上运行它但 IED 中没有错误时,我收到一个错误,说 navigationView.getHeaderView(int) 的对象引用为空
- reactjs - 在 React 中从 Axios 的 API 获取文件名
- javascript - JQuery UI 滑块,仅加载 Button 而不是 Range 并且滑块不滑动
- html - 如何摆脱按钮中的这个幻像元素
- python - pandas - '奇怪' 数据框格式
- python - “在终端中运行 Python 文件”无法使用命令提示符,尝试使用 powershell