Доступна ли концепция обещаний в 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

Другие вопросы по тегам