Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何创建在Gnome应用程序中调用api的主循环_Javascript_Linux_Youtube Api_Gnome_Gnome Shell Extensions - Fatal编程技术网

Javascript 如何创建在Gnome应用程序中调用api的主循环

Javascript 如何创建在Gnome应用程序中调用api的主循环,javascript,linux,youtube-api,gnome,gnome-shell-extensions,Javascript,Linux,Youtube Api,Gnome,Gnome Shell Extensions,所以我试图在GNOME扩展中调用GoogleAPI,我想知道为什么如果我尝试启用扩展,它会使ManjaroLinux崩溃。如果我做了一些根本错误的事情,请通知我,因为我对这一点很陌生,尽管我已经编程多年了。 好的,我在下面添加我的代码 const Main = imports.ui.main; const {St, Clutter} = imports.gi; const GObject = imports.gi.GObject; const Gio = imports.gi.Gio; cons

所以我试图在GNOME扩展中调用GoogleAPI,我想知道为什么如果我尝试启用扩展,它会使ManjaroLinux崩溃。如果我做了一些根本错误的事情,请通知我,因为我对这一点很陌生,尽管我已经编程多年了。 好的,我在下面添加我的代码

const Main = imports.ui.main;
const {St, Clutter} = imports.gi;
const GObject = imports.gi.GObject;
const Gio = imports.gi.Gio;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
const Me = imports.misc.extensionUtils.getCurrentExtension();
const Mainloop = imports.mainloop;

let myPopup;
let panelButton;
const MyPopup = GObject.registerClass(
class MyPopup extends PanelMenu.Button {

 _init () {


    // let icon = new St.Icon({
    //   //icon_name : 'security-low-symbolic',
    //   gicon : Gio.icon_new_for_string( Me.dir.get_path() + '/icon.svg' ),
    //   style_class : 'system-status-icon',
    // });
    // this.add_child(icon);
    let panelButtonText = new St.Label({
        text : "Youtube Channel",
        y_align: Clutter.ActorAlign.CENTER,
    });
    this.add_child(panelButtonText);
    
    let pmItem = new PopupMenu.PopupMenuItem('Normal Menu Item');
    pmItem.add_child(new St.Label({text : 'Label added to the end'}));
    this.menu.addMenuItem(pmItem);

    pmItem.connect('activate', () => {
      log('clicked');
    });

    this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());

    this.menu.addMenuItem(
      new PopupMenu.PopupMenuItem(
        "User cannot click on this item",
        {reactive : false},
      )
    );

    this.menu.connect('open-state-changed', (menu, open) => {
      if (open) {
        log('opened');
      } else {
        log('closed');
      }
    });

    
    
    // sub menu
    let subItem = new PopupMenu.PopupSubMenuMenuItem('sub menu item');
    this.menu.addMenuItem(subItem);
    subItem.menu.addMenuItem(new PopupMenu.PopupMenuItem('item 1'));
    subItem.menu.addMenuItem(new PopupMenu.PopupMenuItem('item 2'), 0);

    // section
    let popupMenuSection = new PopupMenu.PopupMenuSection();
    popupMenuSection.actor.add_child(new PopupMenu.PopupMenuItem('section'));
    this.menu.addMenuItem(popupMenuSection);

    // image item
    let popupImageMenuItem = new PopupMenu.PopupImageMenuItem(
      'Menu Item with Icon',
      'security-high-symbolic',
    );
    this.menu.addMenuItem(popupImageMenuItem);

    // you can close, open and toggle the menu with
    // this.menu.close();
    // this.menu.open();
    // this.menu.toggle();
  }
  load_json_async(url, params, fun) {
    if (_httpSession === undefined) {
        _httpSession = new Soup.Session();
        _httpSession.user_agent = this.user_agent;
    } else {
        // abort previous requests.
        _httpSession.abort();
    }
  
    let message = Soup.form_request_new_from_hash('GET', url, params);
  
    _httpSession.queue_message(message, Lang.bind(this, function(_httpSession, message) {
        try {
            if (!message.response_body.data) {
                fun.call(this, 0);
                return;
            }
            let jp = JSON.parse(message.response_body.data);
            fun.call(this, jp);
        } catch (e) {
            fun.call(this, 0);
            return;
        }
    }));
    return;
  }
  // main() {

  //   var loop = new MainLoop();
  //   var time = new TimeoutSource(2000);

  //   time.set_callback(() => {
  //       stdout.printf("Time!\n");
  //       loop.quit();
  //       return false;
  //   });

  //   time.attach(loop.get_context());

  //   loop.run();
  // } 
});

const MyIcon = GObject.registerClass(
class MyIcon extends PanelMenu.Button {
    _init () {

    super._init(0);
    let icon = new St.Icon({
        //icon_name : 'security-low-symbolic',
        gicon : Gio.icon_new_for_string( Me.dir.get_path() + '/icon.svg' ),
        style_class : 'system-status-icon',
    });
    this.add_child(icon);
}
});
function init() {
    log("started init")
    // Mainloop.timeout_add(1000,() =>{

    //   log("one second later!")
    //   // load_json_async("https://www.googleapis.com/youtube/v3/channels?part=statistics&id=",{},function(json){
    //   //   log(data)
    //   // });
    // });
}

function enable() {
  myPopup = new MyPopup();
  log("started here")
  Main.panel.addToStatusArea('myPopup', myPopup, 0);
//   const https = require('https');
//   log("started pulling data")
//   let timeout = Mainloop.timeout_add_seconds(10, () => {
//         https.get('https://www.googleapis.com/youtube/v3/channels?part=s', (resp) => {
//         let data = '';

//         // A chunk of data has been received.
//         resp.on('data', (chunk) => {
//             data += chunk;
//         });

//         // The whole response has been received. Print out the result.
//         resp.on('end', () => {
//             log(JSON.parse(data).explanation);
//         });

//         }).on("error", (err) => {
//             log("Error: " + err.message);
//         });
        
//   });
//   myIcon = new MyIcon();
//   log("started here")
//   Main.panel.addToStatusArea('myIcon', myIcon, -1);
}

function disable() {
  myPopup.destroy();
}
我已经尝试了一些方法来做到这一点,我想知道我做错了什么。
非常感谢各位。

看来你们错过了几个步骤。例如,在使用汤之前,您不会导入它。此外,通过调用
super.\u init()
,您不会在
PanelMenu.Button中链接子类。您也没有考虑自己函数的参数
load\u json\u async()
,也没有按照您定义的类方法调用它。非常感谢您的回复。不过我确实有一些问题,因为我对gnome扩展还很陌生。是否有任何特殊的方式进口汤,因为要求似乎不起作用。我也不明白如何将panelMenu.Button链接起来。有没有什么地方我能找到一个被锁起来的例子。关于函数,我真的不知道我在做什么,因为我似乎找不到从GNOME访问api的方法,所以我最终尝试从我使用的另一个扩展中获取函数。我确实试过查找,但文档在某些地方很少。非常感谢您的帮助。有关GJS和扩展的文档和指南,请参阅。非常感谢。我会尽快查看