Доступна ли концепция обещаний в ruby?
Мне просто интересно, есть ли в ruby концепция цепочки. Я хотел выполнить ряд асинхронных задач или методов один за другим. Является ли это возможным?
Спасибо рави
4 ответа
Возможно, вы захотите создать класс процесса, что-то вроде:
class MyProcess
PROCESS_STEPS = %w(
step_one
step_two
step_three
)
class << self
def next_step
new.next_step
end
end # Class Methods
#======================================================================
# Instance Methods
#======================================================================
def next_step
PROCESS_STEPS.each do |process_step|
send(process_step) if send("do_#{process_step}?")
end
end
def step_one
# execute step one task
end
def do_step_one?
# some logic
end
def step_two
# execute step two task
end
def do_step_two?
# some logic
end
def step_three
# execute step three task
end
def do_step_three?
# some logic
end
end
Вы, вероятно, поместите это в:
app
|- processes
| |- my_process.rb
Затем в конце каждой задачи сделайте что-то вроде:
MyProcess.next_step
Насколько я могу судить, promise.rb
это наиболее часто используемый гем для асинхронного механизма, соответствующий стандарту js Promise/A+.
Эта статья хорошо знакомит с этим: https://medium.com/@gauravbasti2006/lets-keep-our-promise-in-ruby-e45925182fdc
Javascript, в котором впервые были представлены обещания, также является синхронным, поскольку обещания являются абстракцией по сравнению с обратными вызовами в самом строгом смысле.
Для Ruby существуют библиотеки параллелизма, некоторые из которых в определенной степени передают дух обещаний, поиск в Google promise.rb
дает многообещающие результаты:
https://github.com/lgierth/promise.rb https://github.com/ruby-concurrency/concurrent-ruby
Возможно, это не идиоматический рубин, но они предлагают несколько полезных парадигм.
concurrent-ruby наиболее широко используется для реализации функций, связанных с параллелизмом, таких как промисы, аналогично другим широко используемым языкам. Документация также довольно проста:https://github.com/ruby-concurrency/concurrent-ruby/blob/master/docs-source/promises.in.md .
Для объединения асинхронных задач вы можете использовать следующее:https://github.com/ruby-concurrency/concurrent-ruby/blob/master/docs-source/promises.in.md#chaining