我可以检测到浏览器中可用的异步/等待吗? [复制]

Posted

技术标签:

【中文标题】我可以检测到浏览器中可用的异步/等待吗? [复制]【英文标题】:Can I detect async/await available in browser? [duplicate] 【发布时间】:2018-02-17 23:59:51 【问题描述】:

作为标题,如何检测浏览器中的 async/await es7 支持?

这可能吗?

【问题讨论】:

不完全检测:kangax.github.io/compat-table/esnext 还有:caniuse.com/#search=await async/await 是 ES2017。 【参考方案1】:

目前还没有完美的解决方案,但可以使用eval

let isAsyncSupported;

try 
  isAsyncSupported = eval(`typeof Object.getPrototypeOf(async function() ).constructor === 'function'`);
 catch (exception) 
  isAsyncSupported = false;

更多请看:

https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/AsyncFunction

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

【讨论】:

【参考方案2】:

与任何其他句法特征一样,它应该被评估以便被检测到。由于eval 可以被限制,所以在启用 CSP 时这可能是不可能的:

let isAsync = true;

try 
  eval('async () => ');
 catch (e) 
  if (e instanceof SyntaxError)
    isAsync = false;
  else
    throw e; // throws CSP error

如果目标浏览器可能不支持某个功能,则应转译代码。

允许避免对eval 的 CSP 限制的替代方法是使用外部脚本来检测语法特征,as described here。

【讨论】:

以上是关于我可以检测到浏览器中可用的异步/等待吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如果我不关心它的返回值,我应该等待一个“异步任务”函数吗? [复制]

可以使用 Task.WhenAll(...) 或其他比每次等待更有意义的东西重写此异步/等待代码吗? [复制]

如果javascript“异步”函数的主体中没有“等待”,它会以任何不同的方式执行吗? [复制]

等待最后一个异步调用和返回它有区别吗? [复制]

任何桌面浏览器都可以检测到计算机何时从睡眠中恢复吗?

RocketMQ源码-主从同步复制和异步复制