Transform async/await to promise chains
npm install babel-plugin-transform-async-to-promisesbabel-plugin-transform-async-to-promises
========================================
Babel plugin to transform async functions containing await expressions to the equivalent chain of Promise calls with use of minimal helper functions.
``javascript`
async function fetchAsObjectURL(url) {
const response = await fetch(url);
const blob = await response.blob();
return URL.createObjectURL(blob);
}
`javascript`
const fetchAsObjectURL = _async(function(url) {
return _await(fetch(url), function(response) {
return _await(response.blob(), URL.createObjectURL);
});
});
`javascript`
function _response$blob(response) {
return _await(response.blob(), URL.createObjectURL);
}
const fetchAsObjectURL = _async(function(url) {
return _await(fetch(url), _response$blob);
});
`javascript`
const fetchAsObjectURL = function(url) {
try {
return Promise.resolve(fetch(url)).then(function(response) {
return Promise.resolve(response.blob()).then(URL.createObjectURL);
});
} catch(e) {
return Promise.reject(e);
}
}
In the normal case, helpers are added to the top of the file for the _async and _await functions (as well as others). This can cause bloat in a codebase due to duplication of helper code in every file. To avoid this, enable externalHelpers and those will be imported instead:
`javascript
import { _async } from "babel-plugin-transform-async-to-promises/helpers";
import { _await } from "babel-plugin-transform-async-to-promises/helpers";
const fetchAsObjectURL = _async(function(url) {
return _await(fetch(url), function(response) {
return _await(response.blob(), URL.createObjectURL);
});
});
export default fetchAsObjectURL;
`
/await
- for/while/do loops (including loops that would exhaust stack if dispatched recursively)
- switch statements (including fallthrough and default cases)
- conditional expressions
- logical expressions
- try/catch
- break/continue statements (on both loops and labeled statements)
- throw expressions
- Function hoisting
- Variable hoisting
- Arrow functions
- Methods
- arguments
- this
- Proper member dereference order of operations
- Standards-compliant event loop scheduling$3
- Function.length: async functions will often return a length of 0 (when the _async wrapper is used)
- Top level await support is experimental with compatible module bundler. Set topLevelAwait option to return when using SystemJS.$3
- eval: impossible to support without deep hooks into the runtime
- Async generator functions: not implemented or planned
- Function.name: rewrite pass removes function name instrumentation
- new AsyncFunction(...)`: impossible to support without shipping babel and the plugin in the output