NESTED CALLBACK
ARROW FUNCTIONS
function sum(a, b) {
return a + b;
}const sum = (a, b) => a + b;=
const someFunction = (arg1, callback) => {
// ... some code
console.log('someFunction', arg1);
callback('A');
};
const secondFunction = (arg1, arg2, secondCallback) => {
console.log('secondFunction', arg1, arg2);
secondCallback();
};
const anotherFunction = (anotherCallback) => {
console.log('anotherFunction');
anotherCallback();
};
someFunction('abc', (resultSomeFunction) => {
secondFunction(resultSomeFunction, 'B', () => {
anotherFunction(() => {
console.log('anotherCallback call');
});
});
});
TIME TO DEBUG!

CALLBACK HELL!
THE PYRAMID OF DOOM




PROMISE
PROMISE
Klasa pozwalająca na tworzenie OBIEKTÓW reprezentujących wartość lub niepowodzenie operacji asynchronicznych.
Promise reprezentuje operację która jeszcze się nie zakończyła, ale oczekuje się jej w przyszłości.
CALLBACKS VS PROMISES
- Callback jest funkcją, promise jest obiektem
- Callback przyjmuje parametry, promise jedynie zwraca wartość
- Callback obsługuje sukces oraz błąd, promise nie obsługuje nic a jedynie przekazuje dalej wartości
- Callback możemy wywołać wiele razy, promise jest wywoływany tylko raz
PROMISE STATES
- pending
- fulfilled
- rejected

CREATE PROMISE
const myPromise = new Promise(/* executor */ (resolve, reject) => {
if (/* some logic */) {
resolve('all works fine');
} else {
reject('error');
}
});



.then(onFulfilled, onRejected)
myPromise.then(
result => { /* handle a succcessful result */ },
error => { /* handle an error */ }
);const myPromise = new Promise((resolve, reject) => {
if (/* some logic */) {
resolve('all works fine');
} else {
reject('error');
}
});myPromise.then(
result => {
console.log(result);
},
error => {
console.log(error);
}
);.catch(onRejected)
myPromise
.then(result => { /* ... */ })
.then(result => { /* ... */ })
.catch(error => { /* handle an error */ });const myPromise = new Promise((resolve, reject) => {
if (/* some logic */) {
resolve('all works fine');
} else {
reject('error');
}
});myPromise
.then(result => {
console.log(result);
})
.catch(error => {
console.log(error);
});.finally(onFinally)
myPromise
.then(result => { /* ... */ })
.then(result => { /* ... */ })
.catch(error => { /* handle an error */ })
.finally(() => { /* do something at the end ... */ });Promise.all( [ ... ] )
const promise1 = new Promise((resolve, reject) => {
// ...
resolve('abc');
});
const promise2 = new Promise((resolve, reject) => {
// ...
resolve('xyz');
});
Promise.all([promise1, promise2]);Promise.race( [ ... ] )
const promise1 = new Promise((resolve, reject) => {
// ...
setTimeout(() => resolve('abc'), 1000);
});
const promise2 = new Promise((resolve, reject) => {
// ...
setTimeout(() => resolve('xyz'), 500);
});
Promise.race([promise1, promise2]);Promise.resolve( ... )
Promise.resolve(/* some object/string/etc... */);
Promise
.resolve('resolved promise')
.then(
answer => console.log(answer)
)
.catch(
error => console.log('enter here ?', error)
);Promise.reject( ... )
Promise.reject(/* some object/string/etc... */);
Promise
.reject('some error!!!')
.then(
answer => console.log('enter here ?', answer)
)
.catch(
error => console.log(error)
);ERROR HANDLING



try ... catch
try {
// code...
} catch (error) {
// error handling
}


try ... catch
- try..catch działa tylko w przypadku błędów w czasie wykonywania
- try..catch działa synchronicznie
- try..catch zmienne zadeklarowane są lokalne
- return & finally - finally wykona się zawsze nawet jak w bloku wystąpi return
try ... catch ... finally
try {
// code...
} catch (error) {
// error handling
} finally {
// some code ...
}
Error types
- Error - bazowa klasa błędu
- EvalError - błąd w funkcji eval()
- RangeError - wartość z poza zakresu
- ReferenceError - bład referencji do obiektu
- SyntaxError - błąd składniowy
- TypeError - bład typu
- URIError - błąd w funkcji encodeURI()
Error Object
- name - nazwa błędu
- message - wiadomość błędu
- stack - stack w którym pojawił się błąd
EvalError
EvalError => SyntaxError
RangeError
const someNumber = 5;
someNumber.toPrecision(500); // this throw RangeErrorReferenceError
const a = 5;
const result = a + b; // this throw ReferenceErrorSyntaxError
JSON.parse('crush JSON!'); // this throw SyntaxError
eval('const abc = "some broken string'); // this throw SyntaxErrorTypeError
const someNumber = 5;
someNumber.toUpperCase(); // this throw TypeErrorURIError
decodeURI('%%%'); // this throw URIErrorThrow exception
// throw <error>;
throw 123;
throw "some error string";
throw new Error('some error');
instanceof
const someError = new SyntaxError('abc');
console.log(someError instanceof ReferenceError); // false
console.log(someError instanceof SyntaxError); // true
console.log(someError instanceof Error); // truePROMISE
async/await
async
async function someFunc() {
return ...; // some function body
} const arrowFunc = async () => ... // some function bodyfunction multi(a, b) {
return new Promise((resolve, reject) => {
resolve(a * b);
});
}async function multi(a, b) {
return a * b;
}function multi(a, b) {
return new Promise((resolve, reject) => {
reject(new Error('some error'));
resolve(a * b);
});
}async function multi(a, b) {
throw new Error('some error');
return a * b;
}async function multi(a, b) {
return a + b;
}
multi(4, 5)
.then(result => {
console.log(result);
});

await
const someVar = await <promise>;
const someVar = await Promise.resolve('abc');
const axios = require('axios');
const user = await axios('https://.../users/1');const axios = require('axios');
axios('https://jsonplaceholder.typicode.com/users/2')
.then((response) => {
console.log(response.data.name);
});const axios = require('axios');
(async function() {
const response = await axios('https://jsonplaceholder.typicode.com/users/2');
console.log(response.data.name);
})();async/await
- async tworzy nam funkcję opakowaną w Promise
- await działa jedynie wewnątrz funkcji async
- await nie można stosować w funkcji synchronicznej
- await nie działa w kodzie najwyższego poziomu
Error handling in Promise
async function someFunc() {
await Promise.reject(new Error('error'));
}async function someFunc() {
throw new Error('error');
}const axios = require('axios');
axios('https://jsonplaceholder.typicode.com/users/2')
.then((response) => {
console.log(response.data.name);
})
.catch(error => {
console.log(error)
});const axios = require('axios');
(async function () {
try {
const response = await axios('https://jsonplaceholder.typicode.com/users/2');
console.log(response.data.name);
} catch (error) {
console.log(error);
}
})();callback-and-promise
By Piotr Tarasiuk
callback-and-promise
- 323