Как заставить асинхронный обратный вызов обрабатываться синхронно

#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 его, он заблокирует выполнение до тех пор, пока не будет получено значение.