簡體   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