我正在嘗試從 ssh 服務器獲取資料,但是此操作需要一些時間才能運行,因此我需要等待它們,一旦我擁有它們,我將使用這些資料通過我的 Bot 將它們發送到 Slack。
這是我的代碼:
def sshPingRequest()
Net::SSH.start('xxxx.xxxxx.xxxxx', 'root', :port => "3132") do |ssh|
output = ssh.exec!("ansible -m ping c3")
result = output.split("\n").select { |line| line.include?("SUCCESS") || line.include?("FAILURE") }
puts "############## Done #############"
return result
end
end
SlackRubyBotServer::Events.configure do |config|
data = sshPingRequest() # Help
config.on :command, '/ans-ping' do |command|
command.logger.info 'Received a ping, responding with pong.'
{ text: data }
end
end
基本上我需要等待“結果”變數從第一個函式中準備好,然后在第二個函式中發送它。
提前致謝。
uj5u.com熱心網友回復:
承諾呢?會不會是你要找的東西?
https://ruby-concurrency.github.io/concurrent-ruby/1.1.5/Concurrent/Promise.html
從檔案:
Promise 類似于 futures 并且有許多相同的行為。然而,Promise 更加強大。Promise 可以鏈接在樹結構中,其中每個 Promise 可能有零個或多個子節點。使用 then 方法鏈接 Promise。呼叫 then 的結果總是另一個承諾。Promise 是異步解決的(相對于主執行緒),但是按照嚴格的順序:保證父母在他們的孩子之前被解決,孩子在他們的弟弟妹妹之前被解決。then 方法有兩個引數:在父決議時執行的可選塊和在父失敗時執行的可選可呼叫塊。每個承諾的結果在解決后傳遞給它的每個孩子。當一個 promise 被拒絕時,它的所有子節點都將被立即拒絕并會收到原因。
您還可以查看本指南:
https://medium.com/@gauravbasti2006/lets-keep-our-promise-in-ruby-e45925182fdc
uj5u.com熱心網友回復:
根據檔案
請求從客戶端發送到服務器,并異步回應。這提供了極大的靈活性(因為客戶端一次可以有多個請求待處理),但它也增加了復雜性。Net::SSH 試圖通過提供一些更簡單的同步通信方法來管理這種復雜性(參見 Net::SSH::Connection::Session#exec!)。
所以,我認為你可以呼叫 SlackRubyBotServer::Events.configure 介紹通道 NET::SSH
def foo()
SlackRubyBotServer::Events.configure do |config|
data = sshPingRequest() # Help
config.on :command, '/ans-ping' do |command|
command.logger.info 'Received a ping, responding with pong.'
{ text: data }
end
end
def sshPingRequest()
Net::SSH.start('xxxx.xxxxx.xxxxx', 'root', :port => "3132") do |ssh|
output = ssh.exec!("ansible -m ping c3")
result = output.split("\n").select { |line| line.include?("SUCCESS")
|| line.include?("FAILURE") }
puts "############## Done #############"
foo() # while the channel is open
return result
end
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/498159.html
