gnome - 使用 gio.lookup_by_address
问题描述
大部分代码都是借来的,JS不是我的方式,但需要创建一个扩展。
你能告诉我如何g_resolver_lookup_by_name()
在给定的代码中使用返回 IP 吗?
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 不是函数
解决方案
只是添加到上面的答案:您实际上不再需要实现承诺包装器。GJS 有一个内置函数可以让异步方法返回一个 Promise。
在您的扩展内,您可以确定与主机名匹配的地址,如下所示:
- 使
lookup_by_name_async
方法返回一个Promise
Gio._promisify(Gio.Resolver.prototype, 'lookup_by_name_async', 'lookup_by_name_finish');
- 在您的扩展中初始化解析器(可能在
enable()
函数期间的某个地方)。
const resolver = Gio.Resolver.get_default();
- 定义一个异步函数来查找与主机名匹配的地址并将它们作为字符串数组返回
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;
}
- 在需要的地方调用函数并使用地址
lookupHostName(resolver, "localhost").then(ipAddresses => {
log(JSON.stringify(ipAddresses));
});
在您的日志中,您应该会看到如下内容:
["::1","127.0.0.1"]
推荐阅读
- go - Windows API 错误“句柄无效”
- java - 如何在 Linux 上使用用户名和密码连接到我的 mysql 数据库
- python - 如何使用 numpy 附加 2 个具有不同尺寸和形状的 numpy 图像数组
- regex - 删除电子邮件地址前的文字
- c++ - 客户端未收到 UDP 连接响应
- javascript - 验证成功后无需单击按钮即可删除验证错误消息
- android - Gradle 启动守护进程失败
- java - 如何并行处理 Iterables.partition(...) 结果以与 BatchGetItem API 一起使用?
- c++ - 我如何制作 C++ 医院管理程序的这个(逻辑)部分?
- python - Newspaper3k 图书馆 - 在付费墙后面刮擦