如何使用 jquery .when().apply() 一次从多个承诺中获取已解析的数据

Joe*_*ris 2 javascript jquery promise

我是 JavaScript 新手。我有一系列用于使用 $.getJSON 进行异步 Ajax 调用的承诺。承诺的数量可能会有所不同。所以为了解决它们,我正在使用

$.when.apply($, promises).done(function(data) {
Run Code Online (Sandbox Code Playgroud)

我正在执行 .apply ,因为我不知道有多少个承诺,所以我给它一个承诺数组。我遇到的问题是数据变量仅返回第一个承诺的数据。如果我有两个承诺,我就能做到

$.when.apply($, promises).done(function(firstData, secondData) {
Run Code Online (Sandbox Code Playgroud)

但由于 Promise 的数量未知,我无法为 中的回调函数设置正确的参数.done().done()如果可能的话,我想获取一个包含回调中每个 Ajax 调用的已解析数据的数组

Phi*_*hil 5

这就是扩展语法可以派上用场的地方。

尝试这样的事情

$.when(...promises).done((...results) => {
  // results is an array
})
Run Code Online (Sandbox Code Playgroud)

这是由

  1. promises数组视为单个函数参数

    $.when(promises[0], promises[1], ..., promises[promises.length - 1])
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将回调函数的各个参数组合.done()到一个数组中


为了完整起见,这实际上是您可能不需要 jQuery 的情况之一。现代浏览器支持FetchPromise.all作为$.when和的很好的普通 JS 替代品$.ajax

const getJson = async (url) => {
  const res = await fetch(url)
  if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`)
  return res.json()
}

Promise.all([ getJson(url1), getJson(url2) ]).then(results => {
  // results is an array
})
Run Code Online (Sandbox Code Playgroud)

如果您是那些仍然需要支持 Internet Exploder Explorer 的可怜而不幸的人之一,您可以使用apply()参数对象

$.when.apply($, promises).done(function() {
  var results = arguments
})
Run Code Online (Sandbox Code Playgroud)