У меня есть следующий фрагмент кода, который (в зеркале) выдает мне список моих контактов (управляемых 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 (скажем, метод enable
), и я global.log(contacts.length)
или global.log(contacts2.length)
,Я всегда получаю0
.
Поэтому по какой-то причине этот код работает в зеркале, нонетв расширении. Почему это? Контакты не загружаются в момент выполнения расширения? Поставщик поиска контактов каким-то образом не подключен ко мне? Как это обойти?
решение1
Я задал этот вопрос в списке рассылки gnome-shell — оказалось, что расширения загружаются довольно рано, еще до того, как контакты пользователя будут должным образом загружены.
Добавление 5-секундной задержки к фрагменту кода, который извлекает список контактов (чтобы дать системе возможность загрузить все контакты), работает просто замечательно.