What’s new in ES2017: Async functions, improved objects and more
Let’s take a look at the most important JavaScript updates that came with ES2017, and also briefly cover how this updating process actually takes place.
The Update Process
JavaScript (ECMAScript) is an ever-evolving standard implemented by many vendors across multiple platforms. ES6 (ECMAScript 2015) was a large release which took six years to finalize. A new annual release process was formulated to streamline the process and rapidly add new features.
The modestly named Technical Committee 39 (TC39) consists of parties including browser vendors who meet to push JavaScript proposals along a strict progression path:
Stage 0: strawman -
An initial submission of ideas for new or improved ECMAScript features.
Stage 1: proposal -
A formal proposal document championed by at least one member of TC39, which includes API examples, language semantics, algorithms, potential obstacles, polyfills and demonstrations.
Stage 2: draft -
An initial version of the feature specification. Two experimental implementations of the feature are required, although one can be in a transpiler such as Babel.
Stage 3: candidate -
The proposal specification is reviewed and feedback is gathered from vendors.
Stage 4: finished -
The proposal is ready for inclusion in ECMAScript. A feature should only be considered a standard once it reaches this stage. However, it can take longer to ship in browsers and runtimes such as Node.js.
If ES2015 was too large, ES2016 was purposely tiny to prove the standardization process. Two new features were added:
- The array
.includes()
method which returns true or false when a value is contained in an array, and - The
a ** b
exponentiation operator, which is identical toMath.pow(a, b)
.
What's New in ES2017
The feature set for ES2017 (or ES8 in old money) is considered to be the first proper amendment to the ECMAScript specification. It delivers the following goods …
Async functions
Unlike most languages, JavaScript is asynchronous by default. Commands which can take any amount of time do not halt execution. That includes operations such as requesting a URL, reading a file, or updating a database. A callback function must be passed, which executes when the result of that operation is known.
This can lead to callback hell when a series of nested asynchronous functions must be executed in order. For example:
function doSomething() {
doSomething1((response1) => {
doSomething2(response1, (response2) => {
doSomething3(response2, (response3) => {
// etc...
};
});
});
}
ES2015 (ES6) introduced Promises, which provided a cleaner way to express the same functionality. Once your functions were Promisified, they could be executed using:
function doSomething() {
doSomething1()
.then(doSomething2)
.then(doSomething3)
}
ES2017 Async functions expand on Promises to make asynchronous calls even clearer:
async function doSomething() {
const
response1 = await doSomething1(),
response2 = await doSomething2(response1),
response3 = await doSomething3(response2);
}
await
effectively makes each call appear as though it’s synchronous while not holding up JavaScript’s single processing thread.
Async functions are supported in all modern browsers (not IE or Opera Mini) and Node.js 7.6+. They’ll change the way you write JavaScript, and a whole article could be dedicated to callbacks, Promises and Async functions. Fortunately, we have one! Refer to Flow Control in Modern JavaScript.
The post What’s new in ES2017: Async functions, improved objects and more appeared first on SitePoint.