10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
# File 'lib/async_paginate.rb', line 10
def async_paginate(concurrency, page_fetch_lambda)
barrier = Async::Barrier.new
semaphore = Async::Semaphore.new(concurrency, parent: barrier)
page = 1
first_page_result = page_fetch_lambda.call(page)
total_pages = first_page_result[:page_count]
page_results = [ first_page_result[:payloads] ]
return page_results if total_pages <= 1
Sync do
(2..total_pages).each do |page|
semaphore.async(parent: barrier) do
page_fetch_lambda.call(page)
end
end
end
tasks = barrier.tasks.to_a.map(&:task)
page_results.concat(wait_for_results(tasks))
barrier.stop
page_results.flatten
end
|