Update frontmatter data
This commit is contained in:
112
snippets/async-javascript-cheatsheet.md
Normal file
112
snippets/async-javascript-cheatsheet.md
Normal file
@ -0,0 +1,112 @@
|
||||
---
|
||||
title: Asynchronous JavaScript Cheat Sheet
|
||||
type: cheatsheet
|
||||
tags: [javascript,function,promise]
|
||||
author: chalarangelo
|
||||
cover: green-plant
|
||||
excerpt: Learn everything you need to know about promises and asynchronous JavaScript with this handy cheatsheet.
|
||||
dateModified: 2021-06-12T19:30:41+03:00
|
||||
---
|
||||
|
||||
### Promise basics
|
||||
|
||||
- **Promises** start in a **pending state**, neither fulfilled or rejected.
|
||||
- When the operation is completed, a promise will become **fulfilled with a value**.
|
||||
- If the operation fails, a promise will get **rejected with an error**.
|
||||
|
||||
### Creating promises
|
||||
|
||||
- The function passed to the `Promise` constructor will execute synchronously.
|
||||
- Use `resolve()` or `reject()` to create promises from values.
|
||||
- `Promise.resolve(val)` will fulfill the promise with `val`.
|
||||
- `Promise.reject(err)` will reject the promise with `err`.
|
||||
- If you put a fulfilled promise into a fulfilled promise, they will collapse into one.
|
||||
|
||||
```js
|
||||
// Resolving with a value, rejecting with an error
|
||||
new Promise((resolve, reject) => {
|
||||
performOperation((err, val) => {
|
||||
if (err) reject(err);
|
||||
else resolve(val);
|
||||
});
|
||||
});
|
||||
|
||||
// Resolving without value, no need for reject
|
||||
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
|
||||
```
|
||||
|
||||
### Handling promises
|
||||
|
||||
- `Promise.prototype.then()` accepts two optional arguments (`onFulfilled`, `onRejected`).
|
||||
- `Promise.prototype.then()` will call `onFulfilled` once the promise is fulfilled.
|
||||
- `Promise.prototype.then()` will call `onRejected` if the promise is rejected.
|
||||
- `Promise.prototype.then()` passes errors through if `onRejected` in undefined.
|
||||
|
||||
- `Promise.prototype.catch()` accepts one argument (`onRejected`).
|
||||
- `Promise.prototype.catch()` behaves like `Promise.prototype.then()` when `onFulfilled` is omitted.
|
||||
- `Promise.prototype.catch()` passes fulfilled values through.
|
||||
|
||||
- `Promise.prototype.finally()` accepts one argument (`onFinally`).
|
||||
- `Promise.prototype.finally()` calls `onFinally` with no arguments once any outcome is available.
|
||||
- `Promise.prototype.finally()` passes through input promise.
|
||||
|
||||
```js
|
||||
promisedOperation()
|
||||
.then(
|
||||
val => value + 1, // Called once the promise is fulfilled
|
||||
err => { // Called if the promise is rejected
|
||||
if (err === someKnownErr) return defaultVal;
|
||||
else throw err;
|
||||
}
|
||||
)
|
||||
.catch(
|
||||
err => console.log(err); // Called if the promise is rejected
|
||||
)
|
||||
.finally(
|
||||
() => console.log('Done'); // Called once any outcome is available
|
||||
);
|
||||
```
|
||||
|
||||
- All three of the above methods will not be executed at least until the next tick, even for promises that already have an outcome.
|
||||
|
||||
### Combining promises
|
||||
|
||||
- `Promise.all()` turns an array of promises into a promise of an array.
|
||||
- If any promise is rejected, the error will pass through.
|
||||
- `Promise.race()` passes through the first settled promise.
|
||||
|
||||
```js
|
||||
Promise
|
||||
.all([ p1, p2, p3 ])
|
||||
.then(([ v1, v2, v3 ]) => {
|
||||
// Values always correspond to the order of promises,
|
||||
// not the order they resolved in (i.e. v1 corresponds to p1)
|
||||
});
|
||||
|
||||
Promise
|
||||
.race([ p1, p2, p3 ])
|
||||
.then(val => {
|
||||
// val will take the value of the first resolved promise
|
||||
});
|
||||
```
|
||||
|
||||
### async/await
|
||||
|
||||
- Calling an `async` function always results in a promise.
|
||||
- `(async () => value)()` will resolve to `value`.
|
||||
- `(async () => throw err)()` will reject with an error.
|
||||
- `await` waits for a promise to be fulfilled and returns its value.
|
||||
- `await` can only be used in `async` functions.
|
||||
- `await` also accepts non-promise values.
|
||||
- `await` always waits at least until the next tick before resolving, even when waiting already fulfilled promises or non-promise values.
|
||||
|
||||
```js
|
||||
async () => {
|
||||
try {
|
||||
let val = await promisedValue();
|
||||
// Do stuff here
|
||||
} catch (err) {
|
||||
// Handle error
|
||||
}
|
||||
}
|
||||
```
|
||||
Reference in New Issue
Block a user