2017-02-18 2 views
0

J'essaie de lire à partir d'un socket réseau, Pour utiliser l'information dans une extension gnome. Pour cela, j'utilise le socket client Gio. Je suis capable de connecter et de lire synchrone de l'inputtream. Mais j'échoue sur la lecture asynchrone. J'ai isolé mon problème dans le script suivant:Gnome Javascript: callback ne fonctionne pas pour les fonctions asynchrones

#!/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) {}; 

Dans mon exemple, la fonction "doAsyncCallBack" n'est jamais appelée. L'appel synchrone fonctionne, donc le serveur donne des réponses de propper.

Une partie des informations que je trouve ici, mais le serveur (de Kodi) n'envoie pas d'nouvelles lignes: gjs How to read a socket stream in Gnome Shell Extension using g_data_input_stream_read_line_async

Répondre

0

Je trouve la raison pour laquelle les callbacks ne fonctionnent pas dans mon script. Fondamentalement, c'était la dernière partie du code.

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

C'était ce que je devais faire, pour que ça marche.