Javascript is single-threaded, which means it can only process one statement at a time. To remove this barrier, we can use asynchronous, and this article I will guide and give the basics of 3 ways to write asynchronous code in JavaScript.
What is asynchronous in JavaScript?
JavaScript is essentially a single threaded language, and it runs on a single thread. This thread is based on a concept called the event loop . This thread will respond to events as they occur. As a single-threaded language, JavaScript can only process one statement at a time. While processing that statement, the thread will be blocked.
This streamlined simplicity has many advantages, the simplest of which will make the code easier. You won’t need to worry about concurrency . Your code will be executed from top to bottom according to the way you code. You also won’t have to worry about having many different things running at the same time.
However, it still has the big disadvantage of having only one job done at a time. Everything else has to wait until it completes before it can be executed. This is a real problem if you have to get data from an API.
When calling the API synchronously / synchronously, this may block the main thread until processing is complete. So your code will have to wait until the main thread is open, which means your app will freeze and become unresponsive.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <span class="token keyword">function</span> <span class="token function">makeAPICall</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Bắt đầu gọi API.'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Nhận data từ API.'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">processAPIData</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Xử lý data'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">readTheData</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Đọc data.'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token comment">// function này sẽ phải chờ đến khi</span> <span class="token comment">// hai function makeAPICall() và processAPIData() chạy xong.</span> <span class="token keyword">function</span> <span class="token function">someOtherFunction</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Chức năng khác không liên quan đến API.'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token function">makeAPICall</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">processAPIData</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">readTheData</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">someOtherFunction</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Output:</span> <span class="token comment">// 'Bắt đầu gọi API.'</span> <span class="token comment">// 'Nhận data từ API.'</span> <span class="token comment">// 'Xử lý data'</span> <span class="token comment">// 'Đọc data.'</span> <span class="token comment">// 'Chức năng khác không liên quan đến API.'</span> |
The example above will have problems as soon as there is a delay in the API call. In that case our code will run in a different order than you’d expect. That could lead to unnecessary problems.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <span class="token keyword">function</span> <span class="token function">makeAPICall</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Bắt đầu gọi API.'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// delay 2 giây</span> <span class="token function">setTimeout</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Nhận data từ API.'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Gọi API thành công.'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token number">2000</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">processAPIData</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Xử lý data'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">readTheData</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Đọc data.'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">someOtherFunction</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Chức năng khác không liên quan đến API.'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token function">makeAPICall</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">processAPIData</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">readTheData</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">someOtherFunction</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Output:</span> <span class="token comment">// 'Bắt đầu gọi API.'</span> <span class="token comment">// 'Xử lý data'</span> <span class="token comment">// 'Đọc data.'</span> <span class="token comment">// 'Chức năng khác không liên quan đến API.'</span> <span class="token comment">// 'Nhận data từ API.'</span> <span class="token comment">// 'Gọi data thành công.'</span> |
The solution to the problem is to write asynchronous code, put the API call into asynchronous handling. By doing so, JavaScript can run many different tasks and run at the same time. When running an asynchronous task it will be put into the event queue so it won’t block the main thread.
If the main thread is not blocked then it can do the next task, and your code will continue to run. When the asynchronous task has finished running, it will return data for you to process. There are 3 ways to do this that is callback
, Promise
and async/await
.
Callback
The first and oldest way to deal with asynchronous JavaScript in JavaScript is to use callbacks. A callback is an asynchronous function passed to another function as a parameter on call. When the function finishes running, it will “call back” the passed callback function.
This callback function will not be called, not executed, or do anything until the main function has finished running. This function will not block the main thread so the main thread will be able to do other things. Event listener is one of the callbacks that we often use.
addEventListener()
takes 3 parameters. The first parameter is the type of event you want to listen to. The second parameter is the callback function you want to run when the event occurs. The last parameter is an object and is optional.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <span class="token comment">// tìm button có id là '#btn' trong DOM</span> <span class="token keyword">const</span> btn <span class="token operator">=</span> document <span class="token punctuation">.</span> <span class="token function">querySelector</span> <span class="token punctuation">(</span> <span class="token string">'#btn'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">handleBtnClick</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Click!'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token comment">// gắn event listener vào button,</span> <span class="token comment">// và truyền function xử lý event vào như một callback</span> <span class="token comment">// và callback này sẽ chạy khi và chỉ khi ai đó ấn vào button này.</span> btn <span class="token punctuation">.</span> <span class="token function">addEventListener</span> <span class="token punctuation">(</span> <span class="token string">'click'</span> <span class="token punctuation">,</span> handleBtnClick <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// một cách khác:</span> <span class="token comment">// viết trực tiếp callback.</span> btn <span class="token punctuation">.</span> <span class="token function">addEventListener</span> <span class="token punctuation">(</span> <span class="token string">'click'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Click!'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Callbacks are extremely useful if you cannot know in advance when the data will be available or when the main function will finish running. Take an example of an API call, processing data, and having a delay. It is almost impossible to know in advance when the new API will be complete, as well as the processing of the data.
With the callback, you won’t need to guess when it’s done. You just need to code in the order you want it to be. For example, if the API processing takes time, you can let the data read function as a callback and only execute when there is data. So nothing will block the main thread.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | <span class="token keyword">function</span> <span class="token function">makeAPICall</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Bắt đầu gọi API.'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// delay 2 giây</span> <span class="token function">setTimeout</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Nhận data từ API.'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">processAPIData</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Gọi API thành công.'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token number">2000</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">processAPIData</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Xử lý data'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">readTheData</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token comment">// Create a function to read the API data</span> <span class="token keyword">function</span> <span class="token function">readTheData</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Đọc data.'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token comment">// Create another app function</span> <span class="token comment">// This function will be invoked</span> <span class="token comment">// right after the makeAPICall() function</span> <span class="token comment">// and before all other functions</span> <span class="token keyword">function</span> <span class="token function">someOtherFunction</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Chức năng khác không liên quan đến API.'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token function">makeAPICall</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">someOtherFunction</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Output:</span> <span class="token comment">// 'Bắt đầu gọi API.'</span> <span class="token comment">// 'Chức năng khác không liên quan đến API.'</span> <span class="token comment">// 'Nhận data từ API.'</span> <span class="token comment">// 'Xử lý data'</span> <span class="token comment">// 'Đọc data.'</span> <span class="token comment">// 'Gọi data thành công'</span> |
Promise
That second way of handling asynchronous is promises. Promise is a new feature introduced in ES6 that provides an easier way to handle asynchronousness in JavaScript.
A Promise is an object that holds a value. This value will not be shown when you create a Promise. Promise will return this value when it succeeds or fails. There are 3 handler functions you can use to get the value that Promise returns.
These functions are then()
, catch()
and finally()
. To use these handler functions, we attach them to a Promise object. Depending on the status of the Promise, the corresponding handler will be invoked.
then()
will run when the Promise is successful. You can also sometimes use this to handle a Promise’s failed state.catch()
will run only when the Promise fails.finally()
will run when the Promise finishes running, regardless of success or failure.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | <span class="token keyword">const</span> makeAPICall <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Promise</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token parameter">resolve <span class="token punctuation">,</span> reject</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Bắt đầu gọi API.'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">setTimeout</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Nhận data từ API.'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">resolve</span> <span class="token punctuation">(</span> <span class="token string">'Gọi API thành công.'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token number">2000</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">processAPIData</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Xử lý data'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">readTheData</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Đọc data.'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token comment">// Hàm này sẽ chạy ngay sau Promise makeAPICall</span> <span class="token comment">// và chạy trước tất cả các hàm khác.</span> <span class="token keyword">function</span> <span class="token function">someOtherFunction</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Chức năng khác không liên quan đến API.'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> makeAPICall <span class="token comment">// add handle cho status thành công</span> <span class="token punctuation">.</span> <span class="token function">then</span> <span class="token punctuation">(</span> <span class="token parameter">result</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> result <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">processAPIData</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">readTheData</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token comment">// add handle cho status thất bại</span> <span class="token punctuation">.</span> <span class="token function">catch</span> <span class="token punctuation">(</span> <span class="token parameter">error</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token template-punctuation string">`</span> <span class="token string">Có lỗi xảy ra: </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> error <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string">.</span> <span class="token template-punctuation string">`</span></span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token comment">// bạn có thể thêm finally() ở đây</span> <span class="token comment">// .finally(() => {})</span> <span class="token function">someOtherFunction</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Output:</span> <span class="token comment">// 'Bắt đầu gọi API.'</span> <span class="token comment">// 'Chức năng khác không liên quan đến API.'</span> <span class="token comment">// 'Nhận data từ API.'</span> <span class="token comment">// 'Gọi data thành công'</span> <span class="token comment">// 'Xử lý data'</span> <span class="token comment">// 'Đọc data.'</span> |
Async / await
The last way to deal with asynchronously is to use async / await. Async / await was introduced in ES8, they are composed of two parts. The first part is the async
function. This function will be automatically executed asynchronously. The value it returns is a Promise. Since the Promise is returned, you will have to use the Promise handlers to handle this value.
The second part of async / await is operator await
. This operator will be used in conjunction with a Promise. This will cause the async
function to pause until that Promise has finished running. It will then take the value of the Promise and let the async
function continue to run.
async
functions are asynchronous, when being pause by await
, the rest of the code is still running normally because that function does not block the main thread. When the Promise finishes running, the async
function will continue running and return the value of the Promise.
It is more important that await
must be written in an async
function otherwise there will be a syntax error
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | <span class="token comment">// tạo một hàm async</span> <span class="token keyword">async</span> <span class="token keyword">function</span> <span class="token function">makeAPICall</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// Show notification about API call</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Bắt đầu gọi API.'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Create a Promise to make the API call</span> <span class="token keyword">const</span> dataPromise <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Promise</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token parameter">resolve <span class="token punctuation">,</span> reject</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token function">setTimeout</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Nhận data từ API.'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">resolve</span> <span class="token punctuation">(</span> <span class="token string">'Gọi API thành công.'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token number">2000</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> dataReceived <span class="token operator">=</span> <span class="token keyword">await</span> dataPromise <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">processAPIData</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Xử lý data'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">readTheData</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Đọc data.'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token comment">// Hàm này sẽ chạy ngay sau async makeAPICall</span> <span class="token comment">// và chạy trước tất cả các hàm khác.</span> <span class="token keyword">function</span> <span class="token function">someOtherFunction</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token string">'Some other function not related to API.'</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> makeAPICall <span class="token comment">// add handle cho status thành công</span> <span class="token punctuation">.</span> <span class="token function">then</span> <span class="token punctuation">(</span> <span class="token parameter">result</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> result <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">processAPIData</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">readTheData</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token comment">// add handle cho status thất bại</span> <span class="token punctuation">.</span> <span class="token function">catch</span> <span class="token punctuation">(</span> <span class="token parameter">error</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token template-punctuation string">`</span> <span class="token string">Có lỗi xảy ra: </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> error <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string">.</span> <span class="token template-punctuation string">`</span></span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token comment">// bạn có thể thêm finally() ở đây</span> <span class="token comment">// .finally(() => {})</span> <span class="token function">someOtherFunction</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Output:</span> <span class="token comment">// 'Bắt đầu gọi API.'</span> <span class="token comment">// 'Chức năng khác không liên quan đến API.'</span> <span class="token comment">// 'Nhận data từ API.'</span> <span class="token comment">// 'Gọi data thành công'</span> <span class="token comment">// 'Xử lý data'</span> <span class="token comment">// 'Đọc data.'</span> |
Thank you for reading.
Source: https://blog.alexdevero.com/asynchronous-javascript-code/