大部分代码都是借来的,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不是函数
发布于 2021-03-14 05:24:02
您试图调用一个方法,就好像它是静态的一样,但您首先需要获得默认的解析器:
const Gio = imports.gi.Gio;
// The default resolver
const resolver = Gio.Resolver.get_default();查找名称肯定会阻塞I/O,因此在Shell扩展中使用异步变体是必要的。promise包装器可能是最好的:
function lookupName(host, cancellable = null) {
return new Promise((resolve, reject) => {
resolver.lookup_by_name_async(host, cancellable, (obj, res) => {
try {
resolve(resolver.lookup_by_name_finish(res));
} catch (e) {
reject(e);
}
});
});
}当然,正如文档所述,这将返回一个Gio.InetAddress对象列表,您必须调用to_string()才能获得一个可读地址。
发布于 2021-05-26 01:49:44
补充一下上面的答案:您实际上不再需要实现promise包装器。GJS有一个内置函数,可以让异步方法返回一个promise。
在您的分机中,您可以确定与主机名匹配的地址,如下所示:
lookup_by_name_async方法返回一个PromiseGio._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"]https://stackoverflow.com/questions/66614428
复制相似问题