使用 promise 时函数没有 return 值,JavaScript

Function does not return value when use promise, JavaScript

本人对JavaScript了解甚少,不好意思提出这个问题

我有一个方法:

function userAgent() {
  var result = "";

  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");
          result = "Windows 11 or later";
        } else if (majorPlatformVersion > 0) {
          console.log("Windows 10");
          result = "Windows 10";
        } else {
          console.log("Before Windows 10");
          result = "Before Windows 10";
        }
      } else {
        console.log("Not running on Windows");
        result = "Not running on Windows";
      }
    });

  return result;
}

它 return 是空字符串,但会打印以控制正确的值。

请告诉我我的错误是什么以及如何return这里的值,我想在之后使用它。

谢谢!

你需要做两件事。首先 return 承诺:

return navigator.userAgentData.getHighEntropyValues(["platformVersion"]).then(...).

然后,return 来自 .then() 处理程序的所需值。上面的第一个 return 将 return 来自您的函数的承诺。 .then() 处理程序中的 return 将使该值成为您正在 returning 的承诺的已解决值。

function userAgent() {
    return 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");
                return "Windows 11 or later";
            } else if (majorPlatformVersion > 0) {
                console.log("Windows 10");
                return "Windows 10";
            } else {
                console.log("Before Windows 10");
                return "Before Windows 10";
            }
        } else {
            console.log("Not running on Windows");
            return "Not running on Windows";
        }
    });
}

然后,你可以这样称呼它:

userAgent().then(result => {
   // use the result here
   console.log(result);
});