Вопрос о Linq/lambda о.Select (newby изучение 3.0)

Проблема в том, что предоставленный вами код определил только получение и усиление. отправка сообщений от вашего клиента сервисному работнику.

Приведенный ниже метод определил сообщение для отправки вашему контроллеру (активному) работнику службы.

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 Николас Беваква

8
задан Ferruccio 28 October 2008 в 01:49
поделиться

2 ответа

Измените свой "Выбор" на "Где"

    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);
25
ответ дан 5 December 2019 в 05:35
поделиться
numbers.Select(n => n % 2 == 1);

Измените это на

numbers.Where(n => n % 2 == 1);

То, что делает выбор, является "преобразованием" одна вещь другому. Так в этом случае это "Преобразовывает" n в "n % 2 == 1" (который является булевской переменной) - следовательно Вы получаете все истинное и ложь.

Это обычно используется для получения свойств на вещах. Например, если у Вас был список Person объекты, и Вы хотели получить их имена, Вы сделаете

var listOfNames = listOfPeople.Select( p => p.Name );

Можно думать об этом как так:

  • Преобразуйте список людей в список строк, с помощью следующего метода: (p => p. Имя)

Для "выбирания" (в значении слова "фильтрации") подмножества набора необходимо использовать Где.

Спасибо Microsoft для ужасного именования

5
ответ дан 5 December 2019 в 05:35
поделиться