Skip to content

异步处理

ES6(ECMAScript 2015)及其后续更新引入了多种处理异步代码的新方法,这些改进大大简化了 JavaScript 中异步编程的复杂度。以下是几种主要的异步处理机制:

Promises

Promise 是 ES6 中引入的一种处理异步操作的对象,它代表了一个异步操作的最终完成(或失败)及其结果值。

  • 创建一个 Promise 实例:

    javascript
    let promise = new Promise(function (resolve, reject) {
      // 异步工作
      setTimeout(() => {
        let success = true;
        if (success) {
          resolve("成功");
        } else {
          reject("失败");
        }
      }, 1000);
    });
    
    promise
      .then(function (result) {
        console.log(result); // 输出: 成功
      })
      .catch(function (error) {
        console.error(error); // 如果发生错误,则输出: 失败
      });

Async/Await

asyncawait 是 ES2017 引入的关键字,用于更简洁地处理基于Promise的异步代码。它们使得异步代码看起来像是同步代码一样直观,但不会阻塞主线程。

  • 使用 async 定义异步函数,并使用 await 暂停执行直到 Promise 完成。

    javascript
    async function asyncFunction() {
      try {
        let result = await someAsyncCall(); // 等待异步调用完成
        console.log(result);
      } catch (error) {
        console.error(error);
      }
    }
    
    function someAsyncCall() {
      return new Promise((resolve) => {
        setTimeout(() => {
          resolve("异步操作完成");
        }, 1000);
      });
    }
    
    asyncFunction();

Generators

虽然不是专门为异步编程设计,但是生成器(Generators)提供了一种可以暂停和恢复执行的方式,这在与异步流程控制库(如 co 库)结合使用时特别有用。

  • 基本语法:

    javascript
    function* generatorFunction() {
      yield "第一次暂停";
      yield "第二次暂停";
      return "结束";
    }
    
    let gen = generatorFunction();
    console.log(gen.next().value); // 输出: 第一次暂停
    console.log(gen.next().value); // 输出: 第二次暂停
    console.log(gen.next().value); // 输出: 结束

Fetch API

尽管 fetch 并非 ES6 的一部分,但它通常与上述异步处理机制一起讨论,因为它提供了一种现代的方式来发起网络请求,并返回一个 Promise

  • 发起一个简单的 GET 请求:
    javascript
    fetch("https://jsonplaceholder.typicode.com/posts/1")
      .then((response) => response.json()) // 解析 JSON
      .then((data) => console.log(data)) // 输出数据
      .catch((error) => console.error("Error:", error)); // 错误处理

通过结合使用这些工具,开发者可以更有效地编写清晰、易读且维护性高的异步代码。无论是处理网络请求、文件操作还是其他耗时任务,都可以利用这些异步处理机制来提升应用的响应性和用户体验。

Released under the MIT License.