[英]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.