根据this post,如果我有两个我希望并行加载的网址,然后使用我可以按以下方式执行的数据:
var url1 = 'some-url';
var url2 = 'some-other-url';
$.when(
$.getJSON(url1),
$.getJSON(url2)
).done(function (result1, result2) {
// code using two results
});
我怎样才能将其推广到任意数量的网址,尤其是包含一定数量网址的列表?基本上我想获取一个URL列表,将函数$ .getJSON映射到每个url,并且一旦获取了每个url的数据,就可以对数据进行处理。
答案 0 :(得分:3)
由于$.when
未接受一系列承诺/延迟,因此您需要将从$.getJSON()
返回的每个承诺放入一个数组中,并在$.when
上使用.apply()或使用spread operator(...
),如果定位兼容的浏览器
//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.all(proms).then(function(data){
console.log("data: ",data[0],data[1],data[2]);
});
答案 1 :(得分:2)
看起来每个$.getJSON
都是一个延迟对象。你传递了这些承诺'到when
函数执行它们,并在它们完成后回拨done
。
我们要做的是首先将网址映射到承诺,方法是将getJSON
函数传递给JavaScript的数组map
高阶函数。
现在,我们需要使用动态数量的参数调用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这样的动态语言闪耀的地方。