Обнаружение Windows 11 с помощью Javascript

0

Вопрос

Я пытаюсь определить, использует ли пользователь Windows 11 для обслуживания правильных двоичных файлов, когда он нажимает кнопку загрузки. Я нашел здесь предложение Microsoft о том, как это сделать. Они предлагают использовать navigator.userAgentData.getHighEntropyValues функция, которая возвращает обещание, содержащее версию платформы. Вот код, который они предлагают:

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

Моя проблема в том, что эта функция является асинхронной и возвращает обещание вместо возврата значения. Я не хочу преобразовывать весь код, который я использую для анализа пользовательских агентов для каждой платформы, в асинхронную функцию.

Сначала я думал, что буду использовать wait вместо того, чтобы использовать обещание, подобное этому:

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

Однако это означало, что мне нужно будет сделать функцию, содержащую его, асинхронной. И поскольку этот же код должен работать в старых браузерах, которые не поддерживают асинхронность, и в тех, которые поддерживают, я не могу этого сделать.

Есть ли способ определить, использует ли пользователь Windows 11 без этого API? Или использовать этот API, но таким образом, чтобы не требовалась асинхронность?

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

Лучший ответ

4

Моя проблема в том, что эта функция использует es6 и возвращает обещание вместо возврата значения.

Единственным "ES6" (ES2015) является функция стрелки. Вы можете использовать традиционную функцию, если не хотите использовать функцию со стрелкой. Обещание дается платформой, а не языком.

Я не хочу преобразовывать весь код, который я использую для анализа пользовательских агентов для каждой платформы, в async функция.

Вам не нужно этого делать, вы можете сделать то, что делает показанный вами код: используйте .then метод. Да, он будет асинхронным (информация с высокой энтропией доступна только асинхронно, поскольку, возможно, потребуется запросить разрешение пользователя), но он все равно будет работать в браузерах, которые не поддерживают async функции (при условии, конечно, что они поддерживают getHighEntropyValues).

В противном случае вам придется вернуться к синтаксическому анализу navigator.userAgent а это заведомо ненадежно. Вам это все равно понадобится для агентов, которые не поддерживают getHighEntropyValues или пользователи, которые отказывают в разрешении, так что вы можете сделать все возможное для выпадающего списка. Обязательно укажите раскрывающийся список (или аналогичный), чтобы пользователь мог А) Исправить неверное предположение и Б) Загрузить для последующего использования на другой платформе.

2021-11-23 15:45:54

Спасибо за ответ. Вы правы в том, что функция стрелки es6 не является проблемой и может легко использовать функцию устаревшего стиля. Я предполагаю, что проблема, которую я пытаюсь решить, заключается в том, что функция асинхронна (будь то обратный вызов или ожидание) в том месте, где я хотел бы использовать эту информацию синхронно (поэтому мне не нужно заменять весь код обработки на каждой платформе).
DHamrick

@DHamrick ограничение заключается в том, что API является асинхронным, поэтому его нельзя использовать синхронно.
evolutionxbox

@evolutionxbox достаточно справедливо! Существует ли другой API, который выполняет ту же цель? Выяснение того, использует ли пользователь Windows 11?
DHamrick

@DHamrick нет, я не думаю, что есть. stackoverflow.com/questions/9514179/... большинство ответов, похоже, используют его
evolutionxbox

На других языках

Эта страница на других языках

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