Wykrywanie Windows 11 za pomocą Javascript

0

Pytanie

Próbuję ustalić, czy użytkownik korzysta z systemu Windows 11 do obsługi odpowiednich plików binarnych, gdy kliknie przycisk pobierania. Znalazłem tutaj oferta Microsoft o tym, jak to zrobić. Oferują one korzystać navigator.userAgentData.getHighEntropyValues funkcja, która zwraca obietnica, która zawiera wersję platformy. Oto kod, który oferują:

navigator.userAgentData.getHighEntropyValues(["platformVersion"])
 .then(ua => {
   if (navigator.userAgentData.platform === "Windows") {
     const majorPlatformVersion = parseInt(ua.platformVersion.split('.')[0]);
     if (majorPlatformVersion >= 13) {
       console.log("Windows 11 or later");
      }
      else if (majorPlatformVersion > 0) {
        console.log("Windows 10");
      }
      else {
        console.log("Before Windows 10");
      }
   }
   else {
     console.log("Not running on Windows");
   }
 });

Mój problem polega na tym, że funkcja ta jest asynchroniczne i zwraca obietnica zamiast zwrotu wartości. Nie chcę nawracać cały kod, który używam do analizy własnych agentów dla każdej platformy, w asynchronicznej funkcji.

Najpierw myślałem, że będę używać wait zamiast korzystać z obietnica, coś podobnego do tego:

let ua = await navigator.userAgentData.getHighEntropyValues(["platformVersion"])

To jednak oznaczało, że trzeba będzie zrobić funkcję, który go zawiera, asynchroniczne. I ponieważ ten sam kod musi działać w starszych przeglądarkach, które nie obsługują asynchroniczny, i tych, którzy utrzymują, że nie mogę tego zrobić.

Czy istnieje sposób, aby określić, czy użytkownik korzysta z systemu Windows 11 bez tego API? Lub korzystać z tego API, ale w taki sposób, aby nie była wymagana jest asynchroniczny?

ecmascript-6 javascript windows-11
2021-11-23 15:35:58
1

Najlepsza odpowiedź

4

Mój problem polega na tym, że funkcja ta wykorzystuje es6 i zwraca obietnica zamiast zwrotu wartości.

Jedynym "ES6" (ES2015) jest funkcja zegara. Można użyć tradycyjnej funkcji, jeśli nie chcesz korzystać z funkcji strzałki. Obietnica stosowany platformą, a nie językiem.

Nie chcę nawracać cały kod, który używam do analizy własnych agentów dla każdej platformy, w async funkcja.

Nie musisz tego robić, możesz zrobić to, co sprawia, że polecane przez was kod: użyj .then metoda. Tak, on będzie asynchroniczna (informacje z wysokiej entropii jest dostępna tylko asynchronicznie, ponieważ, być może trzeba poprosić o zgodę użytkownika), ale to wciąż będzie pracować w przeglądarkach, które nie obsługują async funkcje (oczywiście pod warunkiem, że obsługują one getHighEntropyValues).

W przeciwnym razie trzeba będzie wrócić do akceptowane składniowo navigator.userAgent a to notorycznie jest zawodna. Ci to tak potrzebne dla agentów, które nie obsługują getHighEntropyValues czy użytkownicy, którzy odmawiają w rozdzielczości, tak, że można zrobić wszystko, co możliwe, aby rozwijanej listy. Należy podać listę rozwijaną (lub podobny), aby użytkownik mógł A) Naprawić błędne założenie i B) Przesłać do późniejszego wykorzystania na innej platformie.

2021-11-23 15:45:54

Dziękuję za odpowiedź. Masz rację w tym, że funkcja zegara es6 nie jest problemem i można łatwo korzystać z funkcji starszego stylu. Myślę, że problem, który próbuję rozwiązać, polega na tym, że funkcja асинхронна (czy to oddzwanianie lub oczekiwanie) w miejscu, w którym chciałbym wykorzystać te informacje w sposób synchroniczny (więc nie trzeba wymieniać cały kod obsługi na każdej platformie).
DHamrick

@DHamrick ograniczenie polega na tym, że API jest asynchroniczny, więc nie można jej używać synchronicznie.
evolutionxbox

@evolutionxbox wystarczy! Czy istnieje inny API, który wykonuje ten sam cel? Zastanawianie się, czy użytkownik korzysta z systemu Windows 11?
DHamrick

@DHamrick nie, nie sądzę, że istnieje. stackoverflow.com/questions/9514179/... większość odpowiedzi, wygląda na to, używają go
evolutionxbox

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................