亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從 webscoket 客戶端獲取渠道價值

從 webscoket 客戶端獲取渠道價值

Go
慕姐8265434 2022-12-19 17:54:49
我正在運行一個 websocket 客戶端,并希望將響應從客戶端傳遞到我可以在我的主文件中使用的通道。目前,通道只返回一次 nil 值,然后就沒有別的了。將值傳遞給頻道時,我似乎遇到了問題。有什么幫助嗎?這是我到目前為止所做的package mainimport (    "context"    "fmt"    "kraken_client/stored_data"    "kraken_client/ws_client"    "os"    "os/signal"    "strings"    "sync"    "syscall")func main() {    // check if in production or testing mode & find base curency    var testing bool = true    args := os.Args    isTesting(args, &testing, &stored_data.Base_currency)    // go routine handler    comms := make(chan os.Signal, 1)    signal.Notify(comms, os.Interrupt, syscall.SIGTERM)    ctx := context.Background()    ctx, cancel := context.WithCancel(ctx)    var wg sync.WaitGroup    // set ohlc interval and pairs    OHLCinterval := 5    pairs := []string{"BTC/" + stored_data.Base_currency, "EOS/" + stored_data.Base_currency}    // create ws connections    pubSocket, err := ws_client.ConnectToServer("public", testing)    if err != nil {        fmt.Println(err)        os.Exit(1)    }    // listen to websocket connections    ch := make(chan interface{})    wg.Add(1)    go pubSocket.PubListen(ctx, &wg, ch, testing)    // subscribe to a stream    pubSocket.SubscribeToOHLC(pairs, OHLCinterval)    go func() {        for c := range ch {            fmt.Println(c)        }    }()    <-comms    cancel()    wg.Wait()    defer close(ch)}下面是 PubListen 函數的工作原理func (socket *Socket) PubListen(ctx context.Context, wg *sync.WaitGroup, ch chan interface{}, testing bool) {    defer wg.Done()    defer socket.Close()    var res interface{}    socket.OnTextMessage = func(message string, socket Socket) {        //log.Println(message)        res = pubJsonDecoder(message, testing) // this function decodes the message and returns an interface        log.Println(res) // this is printing the correctly decoded value.    }    ch <- res    log.Println(res) // does not print a value    log.Println(ch) // does not print a value    <-ctx.Done()    log.Println("closing public socket")    return}我究竟做錯了什么?
查看完整描述

1 回答

?
九州編程

TA貢獻1785條經驗 獲得超4個贊

問題中的代碼在由 OnTextMessage 函數設置之前執行ch <- res一次語句。PubListenres


要ch在每條消息上發送一個值,請將行ch <- res移至 OnTextMessage 函數。該函數為每條消息調用一次。


func (socket *Socket) PubListen(ctx context.Context, wg *sync.WaitGroup, ch chan interface{}, testing bool) {

    defer wg.Done()

    defer socket.Close()

    socket.OnTextMessage = func(message string, socket Socket) {

        res := pubJsonDecoder(message, testing)

        ch <- res

        log.Println(res)

    }

    <-ctx.Done()

    log.Println("closing public socket")

    return

}


查看完整回答
反對 回復 2022-12-19
  • 1 回答
  • 0 關注
  • 114 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號