我正在尝试检测用户是否正在使用Windows11,以便在单击下载按钮时提供正确的二进制文件。我找到了微软关于如何做到这一点的建议,here。他们建议使用navigator.userAgentData.getHighEntropyValues
函数,该函数返回包含平台版本的promise。以下是他们建议的代码:
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的情况下使用Windows11?或者以一种不需要异步的方式使用这个API?
发布于 2021-11-23 15:45:54
我的问题是,这个函数使用es6并返回一个promise,而不是返回值。
唯一的"ES6“(ES2015)是箭头函数。如果您不想使用箭头函数,则可以使用传统函数。promise是由平台提供的,而不是语言。
我不想把我用来为每个平台解析用户代理的所有代码都转换成一个
async
函数。
您不必这样做,您可以像所示的代码那样执行以下操作:使用.then
方法。是的,它将是异步的(高熵信息只有异步可用,因为它可能必须向用户请求权限),但它仍然可以在不支持async
函数的浏览器上工作(当然,前提是它们支持getHighEntropyValues
)。
否则,您将不得不依赖于解析navigator.userAgent
,这是出了名的不可靠。无论如何,对于不支持getHighEntropyValues
的代理或拒绝权限的用户,您都希望如此,因此您可以对下拉列表进行最佳猜测。确保提供一个下拉列表(或类似的下拉列表),以便用户可以A)更正错误的猜测,以及B)下载以供稍后在其他平台上使用。
https://stackoverflow.com/questions/70083649
复制相似问题