Mam zestaw zadań, które chcę wykonać sekwencyjnie w wątku w tle, z wynikiem każdego zadania przekazywanego do następnego, oraz z łańcuchem, który zawodzi, jeśli jakikolwiek link w łańcuch nie działa.Łańcuch zadań w współbieżnej Ruby
Dla celów argumentacji powiedzmy, że każde zadanie jest obiektem z metodą exec
, która zwraca wartość, chociaż równie dobrze mogłyby to być procs lub lambdas.
Co mam teraz jest coś takiego:
promise = array_of_tasks.inject(nil) do |promise, task|
if promise
promise.then { |prev_result| task.exec(prev_result) }
else
Concurrent::Promise.new { task.exec }
end
end
promise.on_success { |last_result| log.info("Success: #{last_result} ")}
promise.rescue { |reason| log.error("Failure: #{reason}")}
Czy jest bardziej zwięzły sposób, aby to zrobić, albo w Promise
API lub gdzie indziej w Równoczesne Ruby? Wygląda to na dość podstawową operację, ale nie widzę istniejącej metody, która to robi.
(Uwaga: jeśli nie ma takiej metody, czy istnieje znana nazwa tego wzorca w świecie przyszłości i obietnic? Czyli, jeśli sam piszę tę metodę, czy istnieje pewne oczywiste nazwa dla niego)