I have a few changes I'd like to submit. The first is largely opinion based but I think the community adopting a consistent style will ease the onboarding process for those getting into the language. I think the examples should be using const
instead of let
when the reference is not reassigned. Airbnb has a really good style guide for javascript and while it's not a bible it's a good launching point for those developing their own styles IMO. https://github.com/airbnb/javascript#references--prefer-const
I'd like to add an explanation and example for var, let and const, something along the lines of:
Var, Let, Const
Var
is basically antiquated at this point. It was the pre-ES6 way to declare a variable and comes with some gotchas. The declarations are function scoped and var declarations get hoisted to the top of the function which can lead to some unexpected behavior.
function varCheck() {
console.log(x); // => Uncaught ReferenceError: x is not defined
}
var x = 1;
function varCheck() {
console.log(x); // => undefined
{
var x = 2;
console.log(x); // => 2
}
}
Let
is the way to declare a variable in ES6. It can be reassigned after declaration and is block scoped.
let x = 1;
function letCheck() {
console.log(x); // => 1
{
let x = 2;
console.log(x); // => 2
}
console.log(x): // => 1
}
Const
is the way to declare a constant in ES6. The variable can not be assigned after declaration.
const x = 1;
x = 2; // => SyntaxError: Assignment to constant variable: x at 2:0
There is some debate on whether or not const should be used for non primitive types that are mutated but the reference is not reassigned.
const myArray = [1, 2, 3];
myArray.pop();
console.log(myArray); // => [1, 2]
Is valid. If you're unsure airbnb has a fantastic style guide to reference. https://github.com/airbnb/javascript#references--prefer-const
I think that an example of promise chaining is probably a good idea.
.then
methods can be chained. I see a lot of new comers end up in some kind of call back hell inside of a promise when it's completely unnecessary.
//The wrong way
getSomedata
.then(data => {
getSomeMoreData(data)
.then(newData => {
getSomeRelatedData(newData)
.then(finalData => {
console.log(newData);
});
});
});
});
//The right way
getSomeData
.then(data => {
return getSomeMoreData(data);
})
.then(data => {
return getSomeRelatedData(data);
})
.then(data => {
console.log(data);
});
You can see how it's much easier to read the second form and with ES6 implicit returns we could even simplify that further
getSomeData
.then(data => getSomeMoreData(data))
.then(data => getSomeRelatedData(data))
.then(data => console.log(data));
// Because the function supplied to .then will be called with the the result of the resolve method from the promise we can omit the ceremony of creating an anonymous function altogether. This is equivalent to above
getSomeData
.then(getSomeMoreData)
.then(getSomeRelatedData)
.then(console.log);
In the async await section I think it's a good idea to point out that an async function will return a promise
Note: One important thing to note here is that the result of an async
function is a promise
async function myFunc() {
return await greeter;
}
console.log(myFunc()) // => Promise {}
myFunc().then(console.log); // => Hello world!