Javascript-使用$.getJson加载任意数量的URLS
Javascript - Load arbitrary number of URLS with $.getJson
根据这篇文章,如果我有两个url,我想并行加载,然后使用来自的数据,我可以如下所示:
var url1 = 'some-url';
var url2 = 'some-other-url';
$.when(
$.getJSON(url1),
$.getJSON(url2)
).done(function (result1, result2) {
// code using two results
});
我如何将其推广到任意数量的url,尤其是包含一定数量url的列表?从本质上讲,我想获取一个url列表,将函数$.getJSON映射到每个url,一旦提取了每个url的数据,就对数据进行处理。
由于$.when
不接受promise/deferred数组,您需要将从$.getJSON()
返回的每个promise放入一个数组中,并在$.when
上使用.apply()或使用排列运算符(...
)(如果目标是兼容的浏览器)
//map each url to a getJSON call
var urls = ["url","url","url"];
var proms = urls.map(url=>$.getJSON(url));
使用.apply()
$.when.apply($,proms).then(function(data1,data2,data3){
console.log("data: ",data1,data2,data3);
});
使用排列运算符(...
)
$.when(...proms).then(function(...data){
console.log("data: ",data[0],data[1],data[2]);
});
当然,正如pwolaq在评论中提到的那样,您可以将数组传递给Promise.all(),因为它确实接受了promise的可迭代对象
Promise.all(proms).then(function(data){
console.log("data: ",data[0],data[1],data[2]);
});
看起来每个$.getJSON
都是一个延迟对象。您将这些"promise"传递给when
函数以执行它们,并在它们完成后调用回done
。
我们将首先通过将getJSON
函数传递给JavaScript的数组map
高阶函数来将URL映射到promise。
现在,我们需要使用动态数量的参数来调用when
。这就是apply
函数的用武之地。通过使用deferred
作为第二个参数调用此函数,JS调用when(deferred[0], deferred[1], ...)
。
为了在done
函数中获得结果,我们可以使用方便的arguments
变量来动态地获得传递给done
函数的参数。
var urls = ['some-url', 'some-other-url'];
//turn the URLS into promises that we'll get them
var deferred = urls.map($.getJSON);
//make the dynamic call to when
$.when.apply(this, deferred).done(function () { //
// code using two results
for(i in arguments) {
var result = arguments[i];
//do something with result
}
});
谢谢你提出的有趣的问题!这就是像JavaScript这样的动态语言真正的闪光点。
相关文章:
- 将 JavaScript 数组中的项目放在任意索引上
- 任意字符数的正则表达式不受限制,但应仅允许 12 个数字
- 查找循环数组中任意两个索引之间的中间索引
- 检索任意 Javascript 正则表达式中的捕获组数
- 根据百分比在任意长度的数组中查找项目
- 如何在任意范围内随机选择数字并使用 JavaScript 数组相加
- 任意重新排序和排序对象文字的 JavaScript 数组
- 使用日期选择器在行和列中显示任意月份数
- JavaScript或Notepad++正则表达式,为任意文本添加数千个分隔符
- count'最后一个孩子'从javascript对象/数组结构中的任意点
- 将JavaScript中数组值的位置从任意更改为最后一个
- d3.js在从对象数组中绘制任意数量的线时的唯一颜色
- 用任意顺序的字符串数组匹配字符串
- 在JavaScript中以任意起始索引初始化数组
- 将以10为基数的数转换为任意基数的算法
- 基于任意长度的属性排序JavaScript对象数组
- 基于"字符串"的任意数组元素;种子
- Javascript程序不使用数学.用for循环求任意数的幂
- 将变量赋值为这两个数之间的任意数
- 如果希望使用javascript数组作为哈希键,请使用任意数组元素进行检索