gpt4 book ai didi

Ruby,等待回调

转载 作者:太空宇宙 更新时间:2023-11-03 16:24:37 25 4
gpt4 key购买 nike

我正在使用 ruby-mpd 编写一个 mpd 客户端图书馆。它有回调驱动的事件监听器,但我不知道如何等待回调被执行。o

require 'ruby-mpd'

puts "started new thread"
mpd = MPD.new('localhost', '6600', callbacks: true)

# MPD#connect and MPD#disconnect fire the `:connection` event.
mpd.on(:connection) do |connection|
if connection
puts 'connected...'
else
puts 'disconnected'
end
end

mpd.connect

如果我在 IRB 中逐行运行 connected 将在 mpd.connect 之后打印,但如果我将它作为脚本运行,它会在调用 connect 后立即退出(之前回调被调用?)在文件末尾添加 sleep 调用也无济于事。

我怎样才能让这个脚本永不退出并等待来自用户的终止信号?

好的,我查看了 ruby​​-mpd 如何实现回调。它产生一个线程,该线程循环更新状态对象的 block 。如果对象发生变化,它会发出一个事件。

我认为我的初始示例错过了 connection 属性中的更改,因此 even 从未被触发。

require 'ruby-mpd'

mpd = MPD.new('localhost', '6600', callbacks: true)

mpd.on(:connection) do
puts 'connected...'
end

mpd.on(:state) do |state|
puts state
end

mpd.on(:time) do |elapsed_time, total|
puts "#{elapsed_time}/#{total}"
end

mpd.connect

while true; end

最佳答案

您可以将 mpd 调用包装在一个 eventmachine block 中,这将处理 while true; end 循环而不是浪费 cpu 周期。您还将免费获得所有事件机器 I/O、延迟和定时器逻辑?

100% 未经测试的代码,但它会是这样的:

require 'ruby-mpd'

EventMachine.run do

mpd = MPD.new('localhost', '6600', callbacks: true)

mpd.on(:connection) do
puts 'connected...'
end

mpd.on(:state) do |state|
puts state
end

mpd.on(:time) do |elapsed_time, total|
puts "#{elapsed_time}/#{total}"
end

mpd.connect

end

关于Ruby,等待回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27337154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com