繁体   English   中英

优雅的方式在循环中批量运行大量异步“事物”,直到第一个“事物”返回时才知道总数?

[英]Elegant way to run a lot of asynchronous “things” in batches in a loop when the total isn't known until the first “thing” returns?

我正在处理的问题是在所有页面上调用Stack Exchange API(1.1)(问题,标签,等等)。 但实际上它似乎也是一个普遍的问题所以我在这里而不是在StackApps上发布。

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

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

但是,将这个第一个调用作为特殊情况似乎比上述“简单方法”更加复杂。

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

如果它们提供任何有用的东西,我将使用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
  }
}

代码过于简单,因为异步回调中的内容很重要,使代码更复杂,更难读。

我已经尝试了迭代和递归方法,但无法理解细节以使其正确。

那么尽管需要额外的异步调用,“简单方法”是最好的方式吗? 或者实际上是否有办法让我的伪代码工作优雅而不是复杂?

(如果您认为这太专业并且没有概括属于SE API,那么我很乐意将其迁移到StackApps。)

在提出这个问题之后的某个时候,我进入了node.js,处理异步代码可能比浏览器JavaScript更重要。

用于在容器上进行异步控制流和迭代的最流行的模块/库之一是“caolan”的Async.js

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

limit - 随时运行的最大迭代器/任务数。

我会说你应该在99%的情况下采取简单的方法。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM