【问题标题】:How do I get resolved data from multiple promises at once with jquery .when().apply()如何使用 jquery .when().apply() 一次从多个 Promise 中获取已解析的数据
【发布时间】:2021-10-04 15:51:01
【问题描述】:

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

$.when.apply($, promises).done(function(data) {

我在做 .apply 是因为我不知道有多少个 Promise,所以我给它一个 Promise 数组。我遇到的问题是数据变量只返回第一个承诺的数据。如果我有两个承诺,我可以做到这一点

$.when.apply($, promises).done(function(firstData, secondData) {

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

【问题讨论】:

标签: javascript jquery promise


【解决方案1】:

这就是spread syntax 可以派上用场的地方。

试试这样的

$.when(...promises).done((...results) => {
  // results is an array
})

这是由

  1. promises 数组视为单独的函数参数

    $.when(promises[0], promises[1], ..., promises[promises.length - 1])
    
  2. .done() 回调函数的各个参数组合成一个数组


为了完整起见,这确实是you might not need jQuery 的情况之一。现代浏览器支持FetchPromise.all 作为$.when$.ajax 的非常好的香草JS 替代品

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
})

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

$.when.apply($, promises).done(function() {
  var results = arguments
})

【讨论】:

  • 如果您在没有扩展语法的环境中(换句话说,Internet Explorer),那么您将在函数中使用 array-like arguments 来访问所有论据
  • @Bravo 是的。对于.when() 部分,需要坚持使用apply。我会在中添加
  • 它现在以各种方式工作。我会坚持 arguments 对象,因为我必须支持 ie ): 谢谢你的帮助
  • @JoeChris “我确实必须支持 ie”...我很抱歉。请放心,IE 11 只剩下一年的官方支持(到 2022 年 6 月)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-14
  • 2020-04-30
  • 1970-01-01
  • 2013-08-13
  • 2018-03-15
  • 2019-08-18
  • 1970-01-01
相关资源
最近更新 更多