Javascript-使用$.getJson加载任意数量的URL

Javascript-使用$.getJson加载任意数量的URL,javascript,Javascript,根据我想要并行加载的2个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的列表?本质上,我希望获取

根据我想要并行加载的2个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的数据后处理数据。

因为
$。当
不接受承诺/延迟数组时,您需要将从
$.getJSON()返回的每个承诺
放入一个数组中,并在
$上使用。如果目标是兼容的浏览器,则在
上使用或使用(

//map each url to a getJSON call
var urls = ["url","url","url"];
var proms = urls.map(url=>$.getJSON(url));
使用.apply()

使用扩展运算符(

当然,pwolaq在评论中提到,您可以将数组传递给它,因为它确实需要一个可接受的承诺对象

Promise.all(proms).then(function(data){
   console.log("data: ",data[0],data[1],data[2]);
});

看起来每个
$都是延迟对象。您将这些“承诺”传递给
when
函数以执行它们,并在它们完成时调用
done

我们将首先通过将
getJSON
函数传递到JavaScript的数组
map
高阶函数,将URL映射到promises

现在,我们需要在
时使用动态数量的参数调用
。这就是
apply
功能派上用场的地方。通过使用
deferred
作为第二个参数调用此函数,JS在(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等动态语言的亮点所在。

另一种解决方法是将数组与ES6 Promise.all()结合使用
Promise.all(proms).then(function(data){
   console.log("data: ",data[0],data[1],data[2]);
});
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
    }
});