如何在JavaScript中链式调用异步函数?


JavaScript是一种单线程同步函数,执行操作。这是一个耗时的操作,会阻塞线程的其他操作。

我们可以使用JavaScript提供的**异步**编程,执行函数而不会阻塞线程的其他操作。这可以通过异步代码(如Promise或async函数(基本上是更简洁的Promise))来实现。

**异步**函数很酷,但它们的执行时间不确定,这可能会造成问题。此外,跟踪异步函数的任何潜在错误也并非易事。

在本文中,我们将探讨使用**ES2015+特性**(如async函数、箭头函数等)来链式调用异步函数。

示例1

在下面的示例中,我们有3个异步函数。

# index.html

<html>
<head>
   <title>Chaining Async functions</title>
   <script type = "text/javascript">
      <!--
         function showTutorial(name) {
            document.myform.stage.value = name
         }
      //-->
   </script>
</head>
<body>
   <h1 style="color: green;">Welcome To Tutorials Point</h1>
   <script type="text/javascript">
      async function getUserData() {
         console.log('Data fetched successfully.');
      }
      async function cleanUserData(userData) {
         console.log('Cleaning the data');
      }
      async function saveToDataBase(userData) {
         console.log('Data saved successfully to DB.');
      }
      const userData = getUserData();
      const cleanedData = cleanUserData(userData);
      saveToDataBase(cleanedData);
   </script>
</body>
</html>

输出

上面的程序将在控制台中生成与以下屏幕截图类似的结果:

示例2:使用Promise

在下面的示例中,我们使用Promise和**then()**来链式调用异步函数。

# index.html

<html>
<head>
   <title>Chaining Async functions</title>
   <script type = "text/javascript">
      <!--
         function showTutorial(name) {
            document.myform.stage.value = name
         }
      //-->
   </script>
</head>
<body>
   <h1 style="color: green;">
      Welcome To Tutorials Point
   </h1>
   <script type="text/javascript">
      async function getUserData() {
         console.log('Data fetched successfully');
      }
      async function cleanUserData(userData) {
         console.log('Cleaning the data');
      }
      async function saveToDataBase(userData) {
         console.log('Saving to DB');
      }
      getUserData()
         .then((userData) => cleanUserData(userData))
         .then((cleanedData) => saveToDataBase(cleanedData))
         .then(() => console.log('All work done'))
   </script>
</body>
</html>

输出

上面的程序将在控制台中生成与以下屏幕截图类似的结果:

示例3:使用async | await

在下面的示例中,我们将使用async和await函数,这是一种更好、更简洁的执行链式调用的方法。await()函数只能在async()函数内部使用。因此,我们需要将其包装在一个包装函数中。

# index.html

<html>
<head>
   <title>Chaining Async functions</title>
   <script type = "text/javascript">
      <!--
         function showTutorial(name) {
            document.myform.stage.value = name
         }
      //-->
   </script>
</head>
<body>
   <h1 style="color: green;">
      Welcome To Tutorials Point
   </h1>
   <script type="text/javascript">
      async function getUserData() {
         console.log('Data Fetched successfully');
      }
      async function cleanUserData(userData) {
         console.log('Cleaning the data');
      }
      async function saveToDataBase(userData) {
         console.log('Saving to DB');
      }
      async function cleanAndSaveUserData() {
         let userData = await getUserData();
         let cleanedData = await cleanUserData(userData);
         await saveToDataBase(cleanedData);
         console.log('All work done');
      }
      cleanAndSaveUserData(); // does all the work
   </script>
</body>
</html>

输出

上面的程序将在控制台中生成与以下屏幕截图类似的结果:

更新于:2022年4月22日

1K+浏览量

启动你的职业生涯

完成课程获得认证

开始学习
广告