Команда 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)
}
Также см. статью в документации по Асинхронным подключениям.
© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/api/ruby/em_run/