2

我正在尝试检测用户是否正在使用 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");
   }
 });

我的问题是这个函数是异步的并且返回一个promise而不是返回值。我不想将用于解析每个平台的用户代理的所有代码转换为异步函数。

起初,我以为我会使用 await 而不是像这样使用 Promise:

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

但是,这意味着我需要使包含它的函数异步。而且由于同样的代码需要在不支持异步的旧浏览器和支持的浏览器上工作,所以我不能这样做。

有没有办法检测用户是否在没有此 API 的情况下使用 Windows 11?或者使用这个 API 但不需要异步?

4

1 回答 1

4

我的问题是这个函数使用 es6 并返回一个承诺而不是返回值。

唯一的“ES6”(ES2015)有箭头功能。如果不想使用箭头函数,可以使用传统函数。承诺是由平台提供的,而不是语言。

我不想将用于解析每个平台的用户代理的所有代码转换为async函数。

您不必这样做,您可以执行您显示的代码所做的事情:使用.then方法。是的,它将是异步的(高熵信息只能异步获得,因为它可能需要征求用户的许可),但它仍然可以在不支持async功能的浏览器上工作(当然前提是它们支持getHighEntropyValues)。

否则,您将不得不依靠解析navigator.userAgent,这是出了名的不可靠。无论如何,对于不支持的代理getHighEntropyValues或拒绝许可的用户,您都需要这样做,因此您可以对下拉菜单进行最佳猜测。一定要提供一个下拉菜单(或类似的),以便用户可以 A)纠正错误的猜测,以及 B)下载以供以后在另一个平台上使用。

于 2021-11-23T15:45:54.220 回答