Detectar o Windows 11 via Javascript

0

Pergunta

Eu estou tentando detectar se o usuário está usando o Windows 11, a fim de servir os binários corretos quando clicam em um botão de download. Eu encontrei Microsoft sugestão de como fazer isso aqui. Eles sugerem a navigator.userAgentData.getHighEntropyValues função que retorna uma promessa que contém a versão de plataforma. Aqui está o código sugerem:

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");
   }
 });

O meu problema é que esta função é assíncrona e retorna uma promessa, em vez de retornar o valor. Eu não quero ter que converter todo o código que eu uso para analisar os agentes do usuário para cada plataforma para uma função async.

No início, eu pensei que eu ia usar o aguardam em vez de usar a promessa como esta:

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

No entanto, isso significava que eu teria de fazer a função que o contém assíncrona. E desde este mesmo código precisa para funcionar em navegadores antigos que não suportam assíncrona e aquelas que fazer, eu não posso fazer isso.

Existe uma maneira de detectar se o usuário está usando o Windows 11 sem essa API? Ou utilizando esta API, mas de uma forma que não exige assíncrono?

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

Melhor resposta

4

O meu problema é que essa função usa es6 e retorna uma promessa, em vez de retornar o valor.

A única "ES6" (ES2015), há a seta para a função. Você pode usar uma função tradicional, se você não quiser usar uma seta de função. A promessa é fornecida pela própria plataforma, não a língua.

Eu não quero ter que converter todo o código que eu uso para analisar os agentes do utilizador para todas as plataformas em um async função.

Você não precisa, você pode fazer o que o código mostrado faz: Usar o .then o método. Sim, ele vai ser assíncrona (alta entropia da informação está apenas disponível de forma assíncrona, porque ele pode ter que pedir ao usuário permissão), mas ele ainda funciona em navegadores que não suportam async funções (desde que, claro, eles suporte getHighEntropyValues).

Caso contrário, você vai ter que cair para trás em análise navigator.userAgent e que notoriamente não confiável. Você vai querer que de qualquer maneira para agentes que não suportem getHighEntropyValues ou os usuários que negar a permissão, para que você possa fazer o seu melhor palpite para o menu drop-down. Certifique-se de fornecer um menu drop-down (ou similar) para que o usuário possa A) Corrigir uma estimativa incorreta, e B) de Download para utilização posterior em outra plataforma.

2021-11-23 15:45:54

Obrigado pela resposta. Você está certo de que a seta para a função que está sendo es6 não é um problema, e poderia facilmente usar um legado de função de estilo. Eu acho que o problema que estou tentando resolver é a de que a função é assíncrono (seja por retorno de chamada ou esperam) em um lugar que eu gostaria de utilizar essas informações de forma síncrona (então eu não preciso substituir todo o código de tratamento em todas as plataformas).
DHamrick

@DHamrick a limitação é que a API é assíncrono, então ele não pode ser usado de forma síncrona.
evolutionxbox

@evolutionxbox justo o suficiente! Há outra API que cumpre o mesmo objetivo? Descobrir se o usuário está usando o Windows 11?
DHamrick

@DHamrick não, eu não acho que há. stackoverflow.com/questions/9514179/... a maioria das respostas parecem usá-lo
evolutionxbox

Em outros idiomas

Esta página está em outros idiomas

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