首页 > 解决方案 > 使用 gio.lookup_by_address

问题描述

大部分代码都是借来的,JS不是我的方式,但需要创建一个扩展。

你能告诉我如何g_resolver_lookup_by_name()在给定的代码中使用返回 IP 吗?

g-resolver-lookup-by-name

const Main = imports.ui.main;
const St = imports.gi.St;
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();

let myPopup;

const MyPopup = GObject.registerClass(
class MyPopup extends PanelMenu.Button {

  _init () {
    super._init(0);
 ...
    this.menu.addMenuItem(
      new PopupMenu.PopupMenuItem(
        "Some : ", // IP is required to be returned
        {reactive : false},
      )
    );    
  }
});
...

Gio.Resolver.lookup_by_name('google.com')- TypeError: Gio.Resolver.lookup_by_name 不是函数

标签: gnomegnome-shellgnome-shell-extensionsgiogjs

解决方案


只是添加到上面的答案:您实际上不再需要实现承诺包装器。GJS 有一个内置函数可以让异步方法返回一个 Promise。

在您的扩展内,您可以确定与主机名匹配的地址,如下所示:

  1. 使lookup_by_name_async方法返回一个Promise
Gio._promisify(Gio.Resolver.prototype, 'lookup_by_name_async', 'lookup_by_name_finish');
  1. 在您的扩展中初始化解析器(可能在enable()函数期间的某个地方)。
const resolver = Gio.Resolver.get_default();
  1. 定义一个异步函数来查找与主机名匹配的地址并将它们作为字符串数组返回
async function lookupHostName(resolver, hostname, cancellable=null){
    let inetAddressList = await resolver.lookup_by_name_async(hostname, null);
    let addressesAsStrings = inetAddressList.map(address => address.to_string());
    return addressesAsStrings;
}
  1. 在需要的地方调用函数并使用地址
lookupHostName(resolver, "localhost").then(ipAddresses => {
        log(JSON.stringify(ipAddresses));
    });

在您的日志中,您应该会看到如下内容:

["::1","127.0.0.1"]

推荐阅读