Spec-Zone.ru › RethinkDB ruby

Команда ReQL: em_run

Синтаксис команды

query.em_run(conn[, options], block) → cursor
query.em_run(conn[, options], block) → object

Описание

Асинхронно выполняет запрос на подключении с использованием EventMachine. Если запрос возвращает последовательность (включая стрим), блок будет вызываться один раз для каждого элемента последовательности. В противном случае, блок будет вызван только один раз со значением, возвращенным запросом.

Все опции для команды run доступны для em_run; обратитесь к документации run для списка и объяснений.

Команда em_run возвращает экземпляр QueryHandle. Экземпляр QueryHandle будет закрыт, когда все результаты будут получены или когда EventMachine перестанет работать. Вы можете явно закрыть его методом close.

Пример: Возвращает список пользователей в цикле EventMachine.

EventMachine.run {
  r.table('users').order_by(:index => 'username').em_run(conn) { |row|
    # do something with returned row data
    p row
  }
}

Пример: То же, что выше, но допускает устаревшие данные для потенциально более быстрых чтений.

EventMachine.run {
  r.table('users').order_by(:index => 'username').em_run(conn, :read_mode => 'outdated') { |row|
    # do something with returned row data
    p row
  }
}

Пример: Возвращает список пользователей в цикле EventMachine, обрабатывая ошибки.

EventMachine.run {
  r.table('users').order_by(:index => 'username').em_run(conn) { |err, row|
    if err:
      # do something with the error
      p [:err, err]
    else:
      # do something with returned row data
      p [:userdata, row]
    end
  }
}

Пример: Явно закрывает QueryHandle.

EventMachine.run {
  printed = 0
  handle = r.table('test').order_by(:index => 'id').em_run(conn) { |row|
    printed += 1
    if printed > 3
      handle.close
    else
      p row
    end
  }
}

Вместо передачи блока в em_run, вы также можете передать подкласс RethinkDB::Handler, который переопределяет методы обработки событий.

Пример: Используйте обработчик с em_run.

class UserHandler < RethinkDB::Handler

  def on_open
    p :open
  end
  
  def on_close
    p :closed
  end
  
  def on_error(err)
    p [:err, err.to_s]
  end
  
  # Receive each individual user document
  def on_val(val)
    p [:user, val]
  end

  # Receive an array of posts
  def on_atom(val)
    p [:posts, val]
  end

end

EventMachine.run {
  # return a list of users, handled by on_val
  r.table('users').order_by(:index => 'username').em_run(conn, UserHandler)

  # return a list of posts as an array, handled by on_atom
  r.table('users').get(1)['posts'].em_run(conn, UserHandler)
}

Пример: Отслеживание изменения потока 10 самых активных пользователей.

class UserHandler < RethinkDB::Handler

  def on_open
    p :open
  end
  
  def on_close
    p :closed
  end
  
  def on_error(err)
    p [:err, err.to_s]
  end
  
  def on_initial_val(val)
    p [:initial, val]
  end
  
  def on_state(state)
    p [:state, state]
  end
  
  def on_change(old, new)
    p [:change, old, new]
  end  

end

EventMachine.run {
  r.table('users').order_by(:index => r.desc('posts')).limit(10).changes
    .em_run(conn, UserHandler)
}

Также см. статью в документации по Асинхронным подключениям.

Связанные команды

  • run

© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/api/ruby/em_run/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API