异步函数

Frontend SELF ZH
第 43 级 , 课程 3
可用

4.1 关键字async

JavaScript中的异步函数允许你写出看起来像同步代码的异步代码。 关键字asyncawait,在 ECMAScript 2017 (ES8) 中引入,简化了使用promises的工作 并使代码更易读和管理。

基本概念

在函数声明前使用关键字async表示该函数是异步的。异步函数总是返回一个promis,即使没有显式返回return。 如果函数返回一个值,该值会自动被promise包装。

语法:

    
      async function name() {
        // 函数代码
      }
    
  

例子:

JavaScript
    
      async function greet() {
        return 'Hello, world!';
      }

      greet().then((message) => {
        console.log(message); // 输出: Hello, world!
      });
    
  

4.2 关键字await

关键字await在异步函数内部用于暂停其执行,直到promise完成。await只能用在用async声明的函数内。

语法:

    
      let result = await
      promise;
    
  

例子:

JavaScript
    
      function delay(ms) {
        return new Promise((resolve) => setTimeout(resolve, ms));
      }

      async function greet() {
        await delay(2000);
        return 'Hello, world!';
      }

      async function displayGreeting() {
        const message = await greet();
        console.log(message); // 输出: Hello, world! 经过2秒
      }

      displayGreeting();
    
  

4.3 async和await的使用示例

示例1: 带有多个promises的异步函数

JavaScript
    
      function fetchData1() {
        return new Promise((resolve) => setTimeout(() => resolve('Data 1'), 1000));
      }

      function fetchData2() {
        return new Promise((resolve) => setTimeout(() => resolve('Data 2'), 2000));
      }

      async function fetchAllData() {
        const data1 = await fetchData1();
        console.log(data1); // 输出: Data 1 经过1秒

        const data2 = await fetchData2();
        console.log(data2); // 输出: Data 2 经过2秒
      }

      fetchAllData();
    
  

示例2: 并行执行异步操作

要并行执行多个异步操作,可以用Promise.all()结合await

JavaScript
    
      function fetchData1() {
        return new Promise((resolve) => setTimeout(() => resolve('Data 1'), 1000));
      }

      function fetchData2() {
        return new Promise((resolve) => setTimeout(() => resolve('Data 2'), 2000));
      }

      async function fetchAllData() {
        const [data1, data2] = await Promise.all([fetchData1(), fetchData2()]);
        console.log(data1); // 输出: Data 1 经过2秒
        console.log(data2); // 输出: Data 2 经过2秒
      }

      fetchAllData();
    
  

示例3: 使用try...catch处理错误

异步函数可以使用try...catch块处理错误,使代码更易读和管理。

JavaScript
    
      function fetchDataWithError() {
        return new Promise((resolve, reject) => setTimeout(() => reject('Error occurred'), 1000));
      }

      async function fetchData() {
        try {
          const data = await fetchDataWithError();
          console.log(data);
        } catch (error) {
          console.error('Error:', error); // 输出: Error: Error occurred 经过1秒
        }
      }

      fetchData();
    
  

示例4: 在类方法中使用async和await

异步函数也可以在类方法中使用。

JavaScript
    
      class DataFetcher {
        async fetchData() {
          const data = await new Promise((resolve) => setTimeout(() => resolve('Fetched Data'), 1000));
          return data;
        }
      }

      const fetcher = new DataFetcher();
      fetcher.fetchData().then((data) => {
        console.log(data); // 输出: Fetched Data 经过1秒
      });
    
  

示例5: 异步迭代器

异步迭代器允许处理异步到达的数据流。

JavaScript
    
      async function* asyncGenerator() {
        let i = 0;
        while (i < 3) {
          await new Promise((resolve) => setTimeout(resolve, 1000));
          yield i++;
        }
      }

      async function iterateAsyncGenerator() {
        for await (let value of asyncGenerator()) {
          console.log(value); // 输出: 0, 1 和 2,间隔1秒
        }
      }

      iterateAsyncGenerator();
    
  
1
调查/小测验
异步性第 43 级,课程 3
不可用
异步性
异步性
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION