How to deal with the wasted performance problem of async/await
This time I will show you how to deal with the problem of async/await wasted performance, and what are the precautions for dealing with the problem of async/await wasted performance. The following is a practical case, let's take a look.
Preface
What is async/await
async/await can be said to be a co module and a generator Syntactic sugar for functions. Solve js asynchronous code with clearer semantics.
Students who are familiar with the co module should know that the co module is a module written by Master TJ that uses a generator function to solve asynchronous processes. It can be regarded as the executor of the generator function. Async/await is an upgrade to the co module. It has a built-in generator function executor and no longer relies on the co module. At the same time, async returns Promise.
From the above point of view, whether it is the co module or async/await, Promise is used as the most basic unit. Students who do not know much about Promise can first learn more about Promise.
async/await is fun to write, but you should pay attention to these problems.
async/await gets us out of callback hell, but it introduces the problem of async/await hell.
What is async/await hell
Async in Javascript When programming, people always use a lot of await statements. Many times our statements do not need to depend on previous statements, which can lead to performance problems.
async/await hell example
We try to write a program to buy pizza and drinks:
(async () => { const pizzaData = await getPizzaData() // async call const drinkData = await getDrinkData() // async call const chosenPizza = choosePizza() // sync call const chosenDrink = chooseDrink() // sync call await addPizzaToCart(chosenPizza) // async call await addDrinkToCart(chosenDrink) // async call orderItems() // async call })()
This The code runs without problems. But it's not a good implementation because it adds unnecessary waiting.
Instructions
We have encapsulated our code in an asynchronous IIFE and executed it in the following order:
Get the pizza list
Get the drink list
Select a pizza from the list
Select a drink from the list
Add the selected pizza to the shopping cart
Add the selected drink to the shopping cart
Order the shopping cart Items in
Question
There is a question here. Why does the action of selecting pizza from the list have to wait to get the drink list? These two are unrelated operations. There are two groups of related operations:
Get the pizza list-》Select the pizza-》Select the pizza to add to the shopping cart
Get the drink list-》Select the drink-》Select the drink to add to the shopping cart
These two sets of operations should be executed concurrently.
Let’s look at a worse example
This Javascript code snippet removes the items in the shopping cart and makes an order request.
async function orderItems() { const items = await getCartItems() // async call const noOfItems = items.length for(var i = 0; i < noOfItems; i++) { await sendRequest(items[i]) // async call } }
In this case the for loop must wait for the sendRequest() function to complete before continuing with the next iteration. But we don't need to wait. We hope to send all requests as quickly as possible. Then we can wait for all requests to complete.
Now that you should have a better understanding of async/await hell, let’s consider another question
What happens if we forget the await keyword?
If you forget to use await when calling an asynchronous function, it means that there is no need to wait to execute the function. The async function will directly return a promise that you can use later.
(async () => { const value = doSomeAsyncTask() console.log(value) // an unresolved promise })()
Or the program is not clear and you want to wait for the function to finish executing. Direct exit will not complete this asynchronous task. So we need to use the await keyword.
promise has an interesting property. You can get the promise in a certain line of code and wait for it to resolve elsewhere. This is the key to solving async/await hell.
(async () => { const promise = doSomeAsyncTask() const value = await promise console.log(value) // the actual value })()
As you can see doSomeAsyncTask directly returns a Promise. At the same time, the asynchronous function doSomeAsyncTask has begun execution. In order to get the return value of doSomeAsyncTask, we need await to tell
how to avoid async /await hell
首先我们需要知道哪些命名是有前后依赖关系的。
然后将有依赖关系的系列操作进行分组合并成一个异步操作。
同时执行这些异步函数。
我们来重写这写例子:
async function selectPizza() { const pizzaData = await getPizzaData() // async call const chosenPizza = choosePizza() // sync call await addPizzaToCart(chosenPizza) // async call } async function selectDrink() { const drinkData = await getDrinkData() // async call const chosenDrink = chooseDrink() // sync call await addDrinkToCart(chosenDrink) // async call } (async () => { const pizzaPromise = selectPizza() const drinkPromise = selectDrink() await pizzaPromise await drinkPromise orderItems() // async call })() // Although I prefer it this way (async () => { Promise.all([selectPizza(), selectDrink()].then(orderItems) // async call })()
我们将语句分成两个函数。在函数内部,每个语句都依赖于前一个语句的执行。然后我们同时执行这两个函数 selectPizza()和selectDrink() 。
在第二个例子中我们需要处理未知数量的 Promise。处理这个问题非常简单,我们只需要创建一个数组将所有 Promise 存入其中,使用 Promise.all() 方法并行执行:
async function orderItems() { const items = await getCartItems() // async call const noOfItems = items.length const promises = [] for(var i = 0; i < noOfItems; i++) { const orderPromise = sendRequest(items[i]) // async call promises.push(orderPromise) // sync call } await Promise.all(promises) // async call }
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
React怎样在react-router路由实现登陆验证控制
The above is the detailed content of How to deal with the wasted performance problem of async/await. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics











Python is more suitable for beginners, with a smooth learning curve and concise syntax; JavaScript is suitable for front-end development, with a steep learning curve and flexible syntax. 1. Python syntax is intuitive and suitable for data science and back-end development. 2. JavaScript is flexible and widely used in front-end and server-side programming.

The main uses of JavaScript in web development include client interaction, form verification and asynchronous communication. 1) Dynamic content update and user interaction through DOM operations; 2) Client verification is carried out before the user submits data to improve the user experience; 3) Refreshless communication with the server is achieved through AJAX technology.

JavaScript's application in the real world includes front-end and back-end development. 1) Display front-end applications by building a TODO list application, involving DOM operations and event processing. 2) Build RESTfulAPI through Node.js and Express to demonstrate back-end applications.

Understanding how JavaScript engine works internally is important to developers because it helps write more efficient code and understand performance bottlenecks and optimization strategies. 1) The engine's workflow includes three stages: parsing, compiling and execution; 2) During the execution process, the engine will perform dynamic optimization, such as inline cache and hidden classes; 3) Best practices include avoiding global variables, optimizing loops, using const and lets, and avoiding excessive use of closures.

Both Python and JavaScript's choices in development environments are important. 1) Python's development environment includes PyCharm, JupyterNotebook and Anaconda, which are suitable for data science and rapid prototyping. 2) The development environment of JavaScript includes Node.js, VSCode and Webpack, which are suitable for front-end and back-end development. Choosing the right tools according to project needs can improve development efficiency and project success rate.

C and C play a vital role in the JavaScript engine, mainly used to implement interpreters and JIT compilers. 1) C is used to parse JavaScript source code and generate an abstract syntax tree. 2) C is responsible for generating and executing bytecode. 3) C implements the JIT compiler, optimizes and compiles hot-spot code at runtime, and significantly improves the execution efficiency of JavaScript.

JavaScript is widely used in websites, mobile applications, desktop applications and server-side programming. 1) In website development, JavaScript operates DOM together with HTML and CSS to achieve dynamic effects and supports frameworks such as jQuery and React. 2) Through ReactNative and Ionic, JavaScript is used to develop cross-platform mobile applications. 3) The Electron framework enables JavaScript to build desktop applications. 4) Node.js allows JavaScript to run on the server side and supports high concurrent requests.

Python is more suitable for data science and automation, while JavaScript is more suitable for front-end and full-stack development. 1. Python performs well in data science and machine learning, using libraries such as NumPy and Pandas for data processing and modeling. 2. Python is concise and efficient in automation and scripting. 3. JavaScript is indispensable in front-end development and is used to build dynamic web pages and single-page applications. 4. JavaScript plays a role in back-end development through Node.js and supports full-stack development.
