2017-02-18 3 views
0

Ich versuche, von einem Netzwerk-Socket zu lesen, um die Informationen in einer Gnome-Erweiterung zu verwenden. Dazu benutze ich den Gio Socketclient. Ich bin in der Lage zu verbinden und synchrone vom Eingangsstrom zu lesen. Aber ich scheitere beim asynchronen Lesen. Ich habe mein Problem in dem folgenden Skript isoliert:Gnome Javascript: Rückruf funktioniert nicht für Async-Funktionen

#!/usr/bin/gjs 

const Gio = imports.gi.Gio; 


var doAsyncCallBack = function(gobject, async_res, user_data) { 
    print("ASYNC test: doCallBack"); 
    let lineout, charlength, error; 
    [lineout, charlength, error] = gobject.read_upto_finish(async_res); 
    print("ASYNC test: " + lineout + " (" + charlength + ")"); 
}; 


let sc = new Gio.SocketClient(); 
let scc = sc.connect_to_host("kodi", 9090, null); 
let dis = new Gio.DataInputStream({ base_stream: scc.get_input_stream() }); 

//sync 
print("sync test: started"); 
let valuestr, valueint; 
[valuestr, valueint] = dis.read_upto("}" , -1, null); 
print("sync test: " + valuestr + " (" + valueint + ")"); 

//async 
print("ASYNC test: started"); 
dis.read_upto_async("}" , -1, 0, null, doAsyncCallBack); 

// keep in a loop. 
print("(press [crtl-c] to end)"); 
while (0 == 0) {}; 

In meinem Beispiel wird die Funktion "doAsyncCallBack" nie aufgerufen. Der synchrone Anruf funktioniert, so dass der Server korrekte Antworten gibt.

Ein Teil der Informationen, die ich hier gefunden, aber der (kodi) Server sendet keine neue Linien: gjs How to read a socket stream in Gnome Shell Extension using g_data_input_stream_read_line_async

Antwort

0

fand ich den Grund, warum die Rückrufe in meinem Skript nicht funktionieren. Im Grunde war es der letzte Teil des Codes.

// while (0 == 0) {}; 
Clutter.init(null); 
Clutter.main(); 

Das war, was ich tun musste, damit es funktioniert.