Rilevare Windows 11 via Javascript

0

Domanda

Sto cercando di rilevare se l'utente sta utilizzando Windows 11 per servire i file binari corretti quando si fa clic su un pulsante di download. Ho trovato Microsoft suggerimento per come fare qui. Si consiglia di utilizzare la navigator.userAgentData.getHighEntropyValues funzione che restituisce una promessa che contiene la versione della piattaforma. Ecco il codice di essi suggeriscono:

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

Il mio problema è che questa funzione è asincrona e restituisce una promessa, invece di restituire il valore. Io non voglio convertire tutto il codice che uso per analizzare gli agenti utente per ogni piattaforma in funzione async.

In un primo momento, ho pensato di utilizzare attendono invece di usare la promessa di simile a questo:

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

Tuttavia, questo significa che ho bisogno di fare la funzione che contiene async. E dal momento che questo stesso codice deve lavorare su vecchi browser che non supportano async e quelli che lo fanno, io non posso farlo.

C'è un modo per rilevare se l'utente sta utilizzando Windows 11, senza che questa API? O utilizzando questa API, ma in un modo che non richiede async?

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

Migliore risposta

4

Il mio problema è che questa funzione utilizza es6 e restituisce una promessa, invece di restituire il valore.

L'unico "ES6" (ES2015) c'è la freccia funzione. È possibile utilizzare una funzione tradizionale se non si desidera utilizzare una freccia funzione. La promessa è fornito dalla piattaforma, non il linguaggio.

Io non voglio convertire tutto il codice che uso per analizzare gli agenti utente per ogni piattaforma in un async funzione.

Non è necessario, puoi fare quello che il codice che hai mostrato di non: Utilizzare la .then metodo. Sì, sarà asincrona (ad alta entropia di informazione è solo disponibile in modo asincrono, poiché potrebbe chiedere all'utente il permesso), ma continuerà a lavorare su browser che non supportano async funzioni (a patto, naturalmente, che il supporto getHighEntropyValues).

In caso contrario, dovrete ripiegare su analisi navigator.userAgent e che notoriamente inaffidabili. Ti consigliamo che, comunque, per gli agenti che non supportano getHighEntropyValues o gli utenti che negare l'autorizzazione, così si può fare l'ipotesi migliore per la discesa. Essere sicuri di fornire una discesa (o simili) in modo che l'utente può A) Correggere un errato indovinare, e B) Scaricare per utilizzare in seguito su un'altra piattaforma.

2021-11-23 15:45:54

Grazie per la risposta. Hai ragione che la freccia funzione es6 non è un problema, e potrebbe facilmente utilizzare un lascito di una funzione di stile. Credo che il problema che sto cercando di affrontare è che la funzione è asincrono (sia da parte di richiamata o attendono) in un posto che mi piacerebbe utilizzare le informazioni in modo sincrono (quindi non ho bisogno di sostituire tutto il codice di gestione su ogni piattaforma).
DHamrick

@DHamrick la limitazione è che l'API è asincrona, quindi non può essere utilizzato in modo sincrono.
evolutionxbox

@evolutionxbox abbastanza giusto! C'è un'altra API che permetta di raggiungere lo stesso obiettivo? Per capire se l'utente sta utilizzando Windows 11?
DHamrick

@DHamrick no, non credo che c'è. stackoverflow.com/questions/9514179/... più risposte, sembra di usarlo
evolutionxbox

In altre lingue

Questa pagina è in altre lingue

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