Коричневый Javascript Desklet не будет обновляться при вызове веб-страницы

Я совершенно новичок в Cinnamon и javascript (но я достаточно компетентен в Python).

Я пытался обновить существующую брошюру, чтобы показать некоторые футбольные результаты из ленты json в моей сети.

Проблема в том, что скрипт не обновляет данные. Я сузил это, чтобы быть вызванным моим веб-запросом. Я попытался доказать это с помощью того, что на пульте просто показывалось время (в секундах), чтобы я мог видеть, обновляется он или нет. Когда я закомментирую две строки веб-запроса, время обновляется, как и ожидалось. Когда они остаются, время не меняется. Проблема в том, что я не знаю, почему это останавливает обновление.

desklet.js:

const Lang = imports.lang;
const Mainloop = imports.mainloop;
const St = imports.gi.St;
const Json = imports.gi.Json;
const Soup = imports.gi.Soup;


const Desklet = imports.ui.desklet;
const Settings = imports.ui.settings;

const _httpSession = new Soup.SessionAsync();

function MyDesklet(metadata, desklet_id){
    this._init(metadata, desklet_id);
}

MyDesklet.prototype = {
    __proto__: Desklet.Desklet.prototype,

    _init: function(metadata, desklet_id){
        Desklet.Desklet.prototype._init.call(this, metadata);
        this._date = new St.Label({style_class: "football-desklet-label"});
        this.setContent(this._date);
        this.setHeader(_("Football scores"));

        this.settings = new Settings.DeskletSettings(this, this.metadata["uuid"], desklet_id);

        this.settings.bindProperty(Settings.BindingDirection.IN,
                                   "date-format",
                                   "format",
                                   function() {},
                                   null);

    this.settings.bindProperty(Settings.BindingDirection.IN,
                   "font-size",
                   "size",
                   this._onSettingsChanged,
                   null);

        this._onSettingsChanged();

      this.getJSON("http://www.bbc.co.uk");
    },

    getJSON: function(url) {

    // If I leave these two lines in, the time doesn't update.

        let message = Soup.Message.new('GET', url);
        _httpSession.send_message (message);


        let displayDate = new Date();
        this._date.set_text(displayDate.toLocaleFormat("%s"));
        this.timeout = Mainloop.timeout_add_seconds(1, Lang.bind(this,this.getJSON));  
    },


    _onSettingsChanged: function(){
        this._date.style="font-size: " + this.size + "pt; font-style: italic";
    },

    on_desklet_removed: function() {
    Mainloop.source_remove(this.timeout);
    },

    _updateDate: function(){
        let displayDate = new Date();
        this._date.set_text("Hello:" + displayDate.toLocaleFormat("%s"));
        this.timeout = Mainloop.timeout_add_seconds(1, Lang.bind(this, this._updateDate));
    }
}

function main(metadata, desklet_id){
    let desklet = new MyDesklet(metadata, desklet_id);
    return desklet;
}

Если вы хотите проверить это самостоятельно, остальные два файла

settings-schema.json:

{
    "font-size": {
        "type": "spinbutton",
        "default": 50,
        "min": 8,
        "max": 50,
    "units": "",
        "description" : "Font size:",
        "step": 1
    }
}

а также metadata.json:

{
 "uuid": "dev@elparaguayo",
 "name": "Testing desklet",
 "description": "Could do anything...",
 "icon": "stock_calendar",
 "prevent-decorations": false
}

Любая помощь для устранения этого будет принята с благодарностью. Спасибо.

1 ответ

Решение

Я не знаю причину (поэтому, если кто-то может объяснить, пожалуйста, сделайте это в разделе комментариев здесь), но ответ состоял в том, что функция тайм-аута должна была быть в другой функции.

Код выглядит следующим образом:

const Lang = imports.lang;
const Mainloop = imports.mainloop;
const St = imports.gi.St;
const Json = imports.gi.Json;
const Soup = imports.gi.Soup;


const Desklet = imports.ui.desklet;
const Settings = imports.ui.settings;

const _httpSession = new Soup.SessionAsync();

function MyDesklet(metadata, desklet_id){
    this._init(metadata, desklet_id);
}

MyDesklet.prototype = {
    __proto__: Desklet.Desklet.prototype,

    _init: function(metadata, desklet_id){
        Desklet.Desklet.prototype._init.call(this, metadata);
        this._date = new St.Label({style_class: "football-desklet-label"});
        this.setContent(this._date);
        this.setHeader(_("Football scores"));

        this.settings = new Settings.DeskletSettings(this, this.metadata["uuid"], desklet_id);

    this.settings.bindProperty(Settings.BindingDirection.IN,
                   "font-size",
                   "size",
                   this._onSettingsChanged,
                   null);

        this._onSettingsChanged();
        this._updateScore();
    },

    getJSON: function(url) {

   let message = Soup.Message.new('GET', url);
    _httpSession.send_message (message);
    if (message.status_code!== Soup.KnownStatusCode.OK) {
        this._date.set_text("Unable to contact server.");
        var sleep = 30
    } else {

    let jp = new Json.Parser();
    jp.load_from_data(message.response_body.data.toString(), -1);
    match=jp.get_root().get_object();
    let found=match.get_boolean_member('matchfound');
    if (found != true) {
        this._date.set_text("Chelsea are not playing today.");
        var sleep = 30
    } else {
        var sleep = match.get_int_member('sleep');
        match = match.get_object_member('match');
        let hometeam = match.get_string_member('hometeam');
        let awayteam = match.get_string_member('awayteam');
        let homescore = match.get_int_member('homescore').toString();
        let awayscore = match.get_int_member('awayscore').toString();
        this._date.set_text(hometeam + ' ' + homescore + '-' + awayscore + ' ' + awayteam);
    } 
    }
    return sleep;


    },


    _onSettingsChanged: function(){
        this._date.style="font-size: " + this.size + "pt;";
    },

    on_desklet_removed: function() {
    Mainloop.source_remove(this.timeout);
    },

    _updateScore: function(){
        let sleep = this.getJSON("PATH-TO-PRIVATE-JSON-FEED");
        let sleep = ~~(sleep/4)
        this.timeout = Mainloop.timeout_add_seconds(sleep, Lang.bind(this, this._updateScore));
    }
}

function main(metadata, desklet_id){
    let desklet = new MyDesklet(metadata, desklet_id);
    return desklet;
}
Другие вопросы по тегам