Gnome Javascript: обратный вызов не работает для асинхронных функций

Я пытаюсь читать из сетевого сокета, чтобы использовать информацию в расширении gnome. Для этого я использую сокет-клиент Gio. Я могу подключиться и прочитать синхронизацию из входного потока. Но я терплю неудачу при асинхронном чтении. Я изолировал свою проблему в следующем скрипте:

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

В моем примере функция doAsyncCallBack никогда не вызывается. Синхронный вызов работает, поэтому сервер дает правильные ответы.

Часть информации, которую я нашел здесь, но сервер (kodi) не отправляет новые строки: gjs Как читать поток сокета в расширении Gnome Shell с помощью g_data_input_stream_read_line_async


person EMoens    schedule 18.02.2017    source источник


Ответы (1)


Я выяснил причину, по которой обратные вызовы не работают в моем скрипте. По сути, это была последняя часть кода.

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

Это то, что я должен был сделать, чтобы заставить его работать.

person EMoens    schedule 19.02.2017