我有以下程式碼片段(在鏡子中)為我提供了我擁有的聯絡人清單(由 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
asgetInitialResultSet
基本上initial_search
調用ContactSystem.get_default()
.
然而,當我把這些相同的將一些程式碼寫入 gnome shell 擴充(說出方法enable
),並且 Iglobal.log(contacts.length)
或global.log(contacts2.length)
,我總是得到0
。
因此,由於某種原因,這段程式碼可以在鏡子中工作,但是不是在擴展中。為什麼是這樣?執行擴充時聯絡人是否未載入?聯絡人搜尋提供者是否未與我連線?我該如何解決這個問題?
答案1
我在 gnome-shell 郵件列表上詢問了這個問題——事實證明,擴展在本文中很早就加載了,在用戶的聯絡人被正確加載之前。
在檢索聯絡人清單的程式碼片段中新增 5 秒的延遲(讓系統有機會載入所有聯絡人)非常有效。