[英]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 。
它包括三个具有批处理支持的功能:
eachLimit(arr, limit, iterator, callback)
mapLimit(arr, limit, iterator, callback)
parallelLimit(tasks, limit, [callback])
limit
- 随时运行的最大迭代器/任务数。
我会说你应该在99%的情况下采取简单的方法。
考虑一下,如果你的计数为100,那么你将进行101次调用而不是100次,这对于代码复杂化是不值得的,如果你以后需要更改逻辑,你可能会后悔。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.