#ruby #asynchronous #callback #synchronization #pubnub
#ruby #асинхронный #обратный вызов #синхронизация #pubnub
Вопрос:
У меня ситуация, когда я вызываю метод в gem, который выполняет его обработку асинхронно. Я хочу иметь возможность дождаться вызова обратного вызова, прежде чем продолжить выполнение в потоке, где был вызван метод.
gem.async_method(args) do |result|
# the callback
end
# wait until callback is called and then continue execution
puts result # somehow have access to the result from the callback
Комментарии:
1. Какой драгоценный камень вы используете?
2. Я думаю, что это своего рода «правило», согласно которому вы никогда не сможете синхронно вызывать асинхронные методы.
3. @AlexPan Я использую драгоценный камень pubnub. @maxpleaner. Я ищу обходной путь. Самый хакерский способ, который я могу придумать, — это спать после
async_method
вызова до тех пор, пока не будет вызван обратный вызов. Но должен быть лучший способ.4. Можете ли вы предоставить код PubNub? Я думаю, это помогло бы.
Ответ №1:
PubNub Ruby SDK http_sync
Я думаю, вы просто ищете http_sync
параметр, когда вы publish
, subscribe
‘ и т. Д. PubNub. https://www.pubnub.com/docs/ruby/api-reference-sdk-v4#publish_args
pubnub.publish(
channel: 'my_channel',
message: { text: 'Hi!' },
http_sync: true
) do |envelope|
puts envelope.status
end
Комментарии:
1. Не у всех из них есть этот флаг. Нравится
presence
вызов.2. Однако присутствие длится долго, а не недолго.
3. Да, я знаю, но для меня это единственный способ выполнить один раз запрос, чтобы увидеть количество подписчиков при использовании ключа авторизации сервера
Ответ №2:
В конце концов мне удалось найти решение этой проблемы. Камень, который я использовал, вернул a Celluloid::Future
. Если вы вызовете future_object.value
его, он заблокирует выполнение до тех пор, пока не будет получено значение.