Async functions support Chrome 55+, Edge 15+, Firefox 52+, Safari 11+, Opera 42+, and Samsung Internet 6.2+. See full async functions browser support.

Prince Dewani
May 1, 2026
Async functions are a JavaScript language feature defined in the ECMA-262 specification that lets you write Promise-based code using the async and await keywords. They support Chrome 55+, Edge 15+, Firefox 52+, Safari 11+ on macOS and iOS, Opera 42+, Samsung Internet 6.2+, and Opera Mobile 80+, while Internet Explorer never added support.
This guide covers what async functions are, the browsers that support them, the key features, the difference from Promises, fallback options for older browsers, and known issues.
Async functions are JavaScript functions declared with the async keyword. They always return a Promise, automatically wrap return values in Promise.resolve, and let you pause execution at await expressions. The TC39 committee added them so that Promise-based code reads top to bottom instead of as a chain of .then() callbacks.
Async functions ship by default in every modern browser engine. Internet Explorer never added the syntax, and a few mobile browsers needed several major versions to catch up to their desktop counterparts.
Chrome supports async functions from Chrome 55 on Windows, macOS, Linux, ChromeOS, and Android. Chrome 4 to 54 did not support the syntax at all and threw a SyntaxError at parse time when the engine encountered the async keyword in front of a function declaration.
Microsoft Edge supports async functions by default from Edge 15 on Windows. Edge 14 had async functions disabled by default behind the about:flags Experimental JavaScript features toggle, and Edge 12 to 13 did not support the syntax at all. Chromium-based Edge inherits Chrome 79+ behavior on Windows, macOS, Linux, and Android.
Firefox supports async functions from Firefox 52 on Windows, macOS, Linux, and Android. Firefox 2 to 51 did not support the syntax at all, and there was no flag in earlier builds. Firefox for Android picked up async functions in the same release cycle as desktop Firefox 52.
Safari supports async functions from Safari 11 on macOS High Sierra and from Safari 11 on iOS 11. Safari 3.1 to 10.1 on macOS and Safari 3.2 to 10.3 on iOS did not support async or await. Early Safari 11 builds had a known bug parsing the negation operator in front of an awaited expression, which WebKit fixed in later 11.x point releases.
Opera supports async functions from Opera 42 on Windows, macOS, and Linux through the Chromium 55 base. Opera Mobile picked up async functions in Opera Mobile 80 on Android. Opera 9 to 41 on desktop and Opera Mobile 10 to 12.1 on Android did not support the syntax.
Samsung Internet supports async functions from Samsung Internet 6.2 on Galaxy phones and tablets running Android. Samsung Internet 4.0 to 5.4 did not support the syntax. Newer Samsung Internet builds align with the underlying Chromium release, so async function support extends to every modern Galaxy device.
The legacy stock Android Browser, frozen at version 4.4 before Chrome for Android took over, did not support async functions. Modern Android Browser builds (147) ship async functions by default. On any current Android phone, use Chrome for Android, Samsung Internet, or another Chromium-based browser to run async function code.
Internet Explorer never added async function support. IE 5.5 through IE 11 cannot parse the async keyword and throw a SyntaxError before the page runs any code. Microsoft has retired Internet Explorer, so use Edge, Chrome, or Firefox, or transpile your code with Babel and the regenerator runtime if you must run on IE.
Note: Async function support varies across older Safari, mobile browsers, and Internet Explorer. Test it on real browsers and OS with TestMu AI. Try TestMu AI free!
Async functions add a small set of language features on top of Promises. Each one trades a chain of .then() and .catch() calls for cleaner top-to-bottom code.
An async function is a syntax wrapper around Promises, so the two work together rather than competing. The table below shows how the syntax, control flow, and error handling differ in practice.
| Dimension | Async functions | Promises |
|---|---|---|
| Syntax style | Top-to-bottom code with await | Chained .then() and .catch() callbacks |
| Return type | Always a Promise (wrapped automatically) | Always a Promise (constructed explicitly) |
| Error handling | try/catch around awaits | .catch() handler at the end of the chain |
| Conditional flow | Standard if/else and loops with await | Nested .then() callbacks or helper functions |
| Concurrency | await Promise.all for parallel work | Promise.all, Promise.race, Promise.allSettled directly |
| Browser support | Chrome 55+, Edge 15+, Firefox 52+, Safari 11+ | Chrome 32+, Edge 12+, Firefox 29+, Safari 8+ |
| Best fit | Sequential awaits, readable error paths, modern code | Library APIs, low-level control, IE-compatible code |
Run modern source through Babel and ship the transpiled output to any browser that lacks async support. Babel rewrites async and await into a generator-based state machine, which Internet Explorer 11 and old Safari can execute with a tiny runtime polyfill.
async function getUser(id) {
const response = await fetch(`/api/users/${id}`);
if (!response.ok) {
throw new Error("User fetch failed: " + response.status);
}
const user = await response.json();
return user;
}
(async () => {
try {
const user = await getUser(42);
console.log("User loaded:", user.name);
} catch (error) {
console.error("Could not load user:", error);
}
})();If the console reports "regeneratorRuntime is not defined", the polyfill import is missing. Add import "regenerator-runtime/runtime" before any module that uses async functions and rebuild.
Async functions are stable, but a handful of edge cases trip up developers and add cross-browser bugs. Most of them come from the gap between language semantics and how each engine schedules micro-tasks.
In my experience, the trickiest production failure is shipping async function code through a CDN to a fleet that still includes Internet Explorer or old WebView builds. Always compile to ES5 with Babel, import regenerator-runtime once, and feature-detect (async () => {})().constructor.name === "AsyncFunction" before running modern paths.
All async function version numbers and platform notes in this guide come from these primary sources:
Did you find this page helpful?
More Related Hubs
TestMu AI forEnterprise
Get access to solutions built on Enterprise
grade security, privacy, & compliance