我有以下代码片段,它(在镜子中)给出了我拥有的联系人列表(由 gnome-contacts 管理):
// METHOD 1:
const ContactDisplay = imports.ui.contactDisplay;
let csp = new ContactDisplay.ContactSearchProvider();
let contacts = csp.getInitialResultSet(['']);
contacts.length // 120 contacts
// METHOD 2:
const ContactSystem = Shell.ContactSystem;
let cs = ContactSystem.get_default();
let contacts2 = cs.initial_search(['']);
contacts2.length // 120 contacts
这两段代码(据我所知)是等效的,因为ContactSearchProvider
基本上getInitialResultSet
调用了initial_search
的方法ContactSystem.get_default()
。
然而,当我把这些相同的将代码放入 gnome shell 扩展中(例如方法enable
),然后我global.log(contacts.length)
或global.log(contacts2.length)
,我总是得到0
。
因此出于某种原因,这段代码在镜子中有效,但是不是在扩展中。为什么会这样?在执行扩展时联系人是否未加载?联系人搜索提供程序是否未与我建立连接?我该如何解决?
答案1
我在 gnome-shell 邮件列表上询问了这个问题——结果发现扩展是在很早就加载的,在用户的联系人正确加载之前。
在检索联系人列表的代码片段中添加 5 秒的延迟(以便系统有机会加载所有联系人)效果很好。