Javascript 以优雅的方式运行大量异步;“事物”;当总数为';直到第一次才知道;“东西”;返回?

Javascript 以优雅的方式运行大量异步;“事物”;当总数为';直到第一次才知道;“东西”;返回?,javascript,jquery,loops,asynchronous,Javascript,Jquery,Loops,Asynchronous,我正在处理的问题是在所有页面(问题、标记等)上调用堆栈交换API(1.1)。但事实上,这似乎也是一个普遍的问题,所以我在这里发帖,而不是在StackApps上发帖 因此,简单的方法是进行一次初步调用,仅获取总数,然后将其余部分放入循环中 但是第一次调用实际上也可以获取第一页结果并保存一次调用 但是将这个第一次调用作为一个特例似乎比上面的“简单方法”更复杂 由于速率限制,我可以一次获取多个页面,但不能获取所有页面,这一点很复杂 如果jQuery提供了任何有用的东西,我将使用JavaScript和j

我正在处理的问题是在所有页面(问题、标记等)上调用堆栈交换API(1.1)。但事实上,这似乎也是一个普遍的问题,所以我在这里发帖,而不是在StackApps上发帖

因此,简单的方法是进行一次初步调用,仅获取总数,然后将其余部分放入循环中

但是第一次调用实际上也可以获取第一页结果并保存一次调用

但是将这个第一次调用作为一个特例似乎比上面的“简单方法”更复杂

由于速率限制,我可以一次获取多个页面,但不能获取所有页面,这一点很复杂

如果jQuery提供了任何有用的东西,我将使用JavaScript和jQuery

下面是一些我想到的伪代码,但我还没能让它工作:

batch_num = 0
batch_size = 1 // how many pages to fetch in each batch. 1st is just 1 so we know the total

forever {
  get_batch (batch_size)

  if (batch_num == 0) {
    calculate batch_num to use from now on based on the total number of pages and the rate limits
  }

  if (batch_num == last) {
    break
  }

  ++ batch_num
}

exit

function get_batch (batch_size) {
  for (i = 0; i < batch_size; ++i) {
    getJSON next page
  }
}
batch\u num=0
batch_size=1//每个批次要获取多少页。1只是1,所以我们知道总数
永远{
获取批次(批次大小)
如果(批次数量==0){
根据总页数和速率限制计算从现在起要使用的批处理数量
}
如果(批次数量==上次){
打破
}
++批次号
}
出口
函数get\u batch(批大小){
对于(i=0;i
代码过于简单,因为异步回调中的内容很重要,并且使代码更复杂,更难阅读

我尝试过迭代和递归两种方法,但无法集中精力解决细节问题

那么,尽管需要额外的异步调用,“简单方法”是最好的方法吗?还是真的有办法让我的伪代码这样的东西工作起来更优雅而不是复杂?


(如果您觉得这太专业化了,并且没有推广SE API,那么我很乐意将其迁移到StackApps。)

我想说,在99%的情况下,您应该选择简单的方法


考虑一下,如果你数到100,您将进行101次调用,而不是100次调用,这不值得代码复杂化,如果以后需要更改逻辑,您可能会后悔。

提出这个问题后,我最终进入了node.js,在那里处理异步代码可能比在浏览器JavaScript中更重要

使异步控制流和容器上的迭代变得容易的最流行的模块/库之一是

它包括三个支持批处理的功能:

限制
-任何时候运行的迭代器/任务的最大数量


好吧,也许英语不是我的第一语言,但问题是什么?你想让我重新陈述整个事情还是你不明白的某个部分?这个问题的灵感部分来自于对的回答。更多的是关于你是否想就你是否应该用“简单的方式”做这件事发表意见,或者您需要代码的具体部分的帮助吗?你在描述你的想法,但我看不出一个具体的问题。@JoachimIsaksson:好的,说得好。试着用英语表达伤了我的大脑,所以我没有意识到“实际问题”部分不见了!