如何从 Concurrent::Promise::all 中获取结果?

How to get results from Concurrent::Promise::all?

使用conccurrent-ruby,如何执行一组承诺然后得到结果?

这是我希望能够做的一个例子(测试通过是因为它从未到达'then'块。

it "can aggregate the results" do
  Concurrent::Promise::all?(
    Concurrent::Promise.execute { 42 },
    Concurrent::Promise.execute { 43 },
  ).then do |result|
      binding.pry
      expect(result).to eq([42, 43])
    end
end

为了执行 .all? 承诺,您需要调用 .execute.wait,这意味着它将执行然后等待结果准备好,注意 wait 是阻塞意味着它会阻塞你的代码`。 例如:


Concurrent::Promise.all?(
  Concurrent::Promise.new { 42 },
  Concurrent::Promise.new { 43 }
).then do |result|
  puts 'finished promises'
end.execute.wait

然而,如果你希望在承诺完成后得到结果,你可以使用 .zip 方法,例如:


Concurrent::Promise.zip(
  Concurrent::Promise.execute { 42 },
  Concurrent::Promise.execute { 43 }
).then do |result|
  expect(result).to eq([42, 43])
end.wait

注意:.zip.all? 之间存在一些差异,请查看文档:https://www.rubydoc.info/gems/concurrent-ruby/Concurrent/Promise