Могу ли я обнаружить async/await, доступный в браузере?

В качестве заголовка, как я могу обнаружить поддержку async/await es7 в браузере?

Это возможно?


person 3142 maple    schedule 09.09.2017    source источник
comment
Не совсем обнаружение: kangax.github.io/compat-table/esnext   -  person    schedule 09.09.2017
comment
Также: caniuse.com/#search=await   -  person    schedule 09.09.2017
comment
асинхронный/ожидающий — это ES2017.   -  person Estus Flask    schedule 09.09.2017


Ответы (2)


Как и любой другой синтаксический признак, он должен быть оценен, чтобы быть обнаруженным. Поскольку eval можно ограничить, это может быть невозможно, если CSP включен:

let isAsync = true;

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

Если есть вероятность, что целевые браузеры не поддерживают функцию, код следует транспилировать.

Альтернативой, которая позволяет избежать ограничений CSP для eval, является использование внешнего скрипта для обнаружения синтаксических функций, как описано здесь.

person Estus Flask    schedule 09.09.2017

В настоящее время для этого нет идеального решения, но это можно сделать с помощью 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

person Maciek Jurczyk    schedule 09.09.2017