Проблема в том, что предоставленный вами код определил только получение и усиление. отправка сообщений от вашего клиента сервисному работнику.
Приведенный ниже метод определил сообщение для отправки вашему контроллеру (активному) работнику службы.
onClickHandler = () => {
console.log('on click', 'posting skipWaiting');
navigator.serviceWorker.controller.postMessage('skipWaiting');
};
В приведенном ниже определении добавлен прослушиватель событий в ваш контейнер ServiceWorker для получения любых сообщений, отправленных работником службы.
navigator.serviceWorker.addEventListener('message', event => {
console.log('skip waiting');
if (event.data === 'skipWaiting') {
self.skipWaiting();
}
});
Теперь вам нужно определить обработчики событий из файла рабочего сервиса для получения & amp; отправлять сообщения.
В файле рабочего сервиса, чтобы получать сообщения от клиента:
self.addEventListener('message', function handler (event) {
console.log('skip waiting');
if (event.data === 'skipWaiting') {
self.skipWaiting();
}
});
Чтобы отправлять сообщения от serviceworker вашему клиенту:
self.addEventListener('fetch', function(event) {
self.clients.matchAll().then(all => all.map(client => client.postMessage('data from webworker')));
});
Вы также можете отправить данные обратно из сервисный работник, использующий MessageChannel. На вашем клиенте вы должны будете определить что-то вроде следующего:
navigator.serviceWorker
.register(swUrl)
.then(registration => {
var messageChannel = new MessageChannel();
// listener for messages from the ServiceWorker
messageChannel.port1.addEventListener('message', (event) => console.log(event.data));
function sendMessage (message) {
//send message to the active service worker
navigator.serviceWorker.controller.postMessage(message, [messageChannel.port2]);
}
onClickHandler = () => {
sendMessage('skipWaiting');
};
});
Я нашел приведенную ниже статью весьма полезной.
ServiceWorker, MessageChannel & amp; postMessage Николас Беваква
Измените свой "Выбор" на "Где"
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var oddNumbers = numbers.Where(n => n % 2 == 1);
Console.WriteLine("Odd Number:");
foreach (var x in oddNumbers)
{
Console.WriteLine(x);
}
"Избранный" метод создает новый список результата лямбды для каждого (истинного/ложного) элемента. "Где" метод фильтрует на основе лямбды.
В C# Вы могли также использовать этот синтаксис, который можно найти более ясным:
var oddNumbers = from n in numbers
where n % 2 == 1
select n;
в который переводит компилятор:
var oddNumbers = numbers.Where(n => n % 2 == 1).Select(n => n);
numbers.Select(n => n % 2 == 1);
Измените это на
numbers.Where(n => n % 2 == 1);
То, что делает выбор, является "преобразованием" одна вещь другому. Так в этом случае это "Преобразовывает" n в "n % 2 == 1" (который является булевской переменной) - следовательно Вы получаете все истинное и ложь.
Это обычно используется для получения свойств на вещах. Например, если у Вас был список Person
объекты, и Вы хотели получить их имена, Вы сделаете
var listOfNames = listOfPeople.Select( p => p.Name );
Можно думать об этом как так:
Для "выбирания" (в значении слова "фильтрации") подмножества набора необходимо использовать Где.
Спасибо Microsoft для ужасного именования