【问题标题】:AJAX requests poolAJAX 请求池
【发布时间】:2017-06-26 11:20:25
【问题描述】:

我有 FormData 对象数组,我想将它们发布到同一个 URL。我想一次发出固定数量的 AJAX 请求,因为我想创建 xhr 对象池。该怎么做?

【问题讨论】:

  • “池”具体是什么意思?
  • 如果您将 AJAX 请求包装在 Promise 中,您可以使用 this answer 来解决此问题。
  • 池是指 XMLHttpRequest 对象的数组。
  • @simpleJ 可以给代码sn-p
  • 我认为他只想要(n)个 ajax 请求在任何时候都是最新的。如果是这样,请使用循环来触发初始 ajax 请求,然后让成功或失败处理程序调用一个函数来启动下一个请求(如果还有待发送)。

标签: javascript ajax


【解决方案1】:

您可以使用Array.prototype.splice()Promise.all()fetch() 一次执行N 请求。

let data = [FormData, FormData, ..];

let N = 5;

let pool = data.splice(0, N);

let processData = requests => 
  Promise.all(
    requests.map(fd =>
      fetch("/path/to/server", {
        method: "POST",
        body: fd
      })
      .then(response => response.ok)
    )
  )
  .then(responses => responses.every(result => result))
  .then(result => {
    if (result) {
      if (data.length) {
        pool = data.splice(0, N);
        return true
      }
    }
    return "complete"
  });    

let fn = next => next === true ? processData(pool).then(fn) : next;

processData(pool)
.then(fn)
.then(complete => console.log(complete))
.catch(err => console.log(err));

jsfiddle https://jsfiddle.net/ce1kzu52/5/

如果数组中剩余任何元素,您也可以在不安排再次调用函数processData 的情况下处理数组。

【讨论】:

    猜你喜欢
    • 2012-04-22
    • 1970-01-01
    • 2020-04-05
    • 2018-03-30
    • 2017-07-09
    • 2016-03-04
    • 2015-08-26
    • 2016-05-20
    相关资源
    最近更新 更多