链式编程艺术:探索 Promise 链的美妙之处

news2024/11/23 21:56:41

在这里插入图片描述

文章目录

    • 1. 什么是 Promise?它解决了什么问题?
    • 2. Promise 有哪些状态,并且解释每个状态的含义。
    • 3. 如何创建一个 Promise,并描述其基本结构和用法。
    • 4. 解释 Promise 的链式调用(chaining)和方法的执行顺序。
    • 5. 解释 Promise 的错误处理机制以及如何在链式调用中捕获错误。
    • 6. Promise.resolve() 和 Promise.reject() 的作用是什么?
    • 7. 解释 Promise.all() 和 Promise.race() 的区别和用途。
    • 8. 怎样使用 async/await 结合 Promise 进行异步操作的处理?
    • 9. Promise 中的回调函数和 then() 方法哪个会先执行?
    • 10. 怎样在多个 Promise 中进行顺序执行和并发执行?
    • 附录:前后端实战项目(简历必备) 推荐:★★★★★

1. 什么是 Promise?它解决了什么问题?

Promise 是 JavaScript 中用于处理异步操作的对象
它可以表示一个异步操作的最终完成或失败,并可以返回操作结果或错误信息。

Promise 解决了传统回调函数嵌套过多导致的回调地狱问题。在过去,为了处理多个异步操作的依赖关系,开发者经常需要嵌套多个回调函数,这导致代码难以理解、维护困难,并可能引发错误。

通过使用 Promise,开发者可以更优雅地处理异步操作。Promise 提供了一个链式调用的方式,允许按顺序组织和处理异步操作,使代码更具可读性和可维护性。它还提供了一种确保异步操作完成后执行特定代码的机制,例如处理返回结果、捕获错误等。

通过使用 Promise,我们可以避免层层嵌套的回调函数,使异步代码更易于编写和理解。它提供了一种结构化的方式来处理异步操作,使开发者能够更好地控制流程,并处理异步操作的成功和失败状态。因此,Promise 在解决异步编程中的复杂性和回调地狱问题方面发挥着重要作用。

2. Promise 有哪些状态,并且解释每个状态的含义。

Promise 有以下三种状态:

  1. Pending(进行中): 初始状态,表示异步操作尚未完成,也未被拒绝。
  2. Fulfilled(已完成): 表示异步操作成功完成,解决了 Promise。在这个状态下,Promise 的结果可用,可以通过 .then() 方法访问。
  3. Rejected(已拒绝): 表示异步操作失败,拒绝了 Promise。在这个状态下,Promise 的结果不可用,可以通过 .catch() 或其他错误处理方式来获取错误信息。

当一个 Promise 被创建时,它处于进行中(Pending)状态。在执行异步操作期间,Promise 可能会从进行中转换为已完成(Fulfilled)状态,表示操作成功完成并返回结果。或者,如果出现错误或操作失败,则会将 Promise 转换为已拒绝(Rejected)状态,表示操作被拒绝并返回错误信息。

无论是 Fulfilled 还是 Rejected 状态,一旦 Promise 转变为最终状态,它就是不可变的,即不可再转换到其他状态。当 Promise 处于最终状态时,可以使用 .then() 方法处理已完成的 Promise,或使用 .catch() 方法处理已拒绝的 Promise。

总之,Pending 表示进行中,Fulfilled 表示成功完成,Rejected 表示失败或拒绝。这些状态用于表示异步操作的不同阶段和结果,以便进一步处理和处理异步操作的结果。

3. 如何创建一个 Promise,并描述其基本结构和用法。

要创建一个 Promise,你可以使用 Promise 构造函数。Promise 构造函数接受一个执行器函数作为参数,该执行器函数在 Promise 被创建时立即执行。

Promise 的基本结构如下:

const myPromise = new Promise((resolve, reject) => {
  // 异步操作代码

  // 如果异步操作成功完成,调用 resolve 并传递结果
  // resolve(result);

  // 如果异步操作失败,调用 reject 并传递错误信息
  // reject(error);
});

在上述代码中,myPromise 是创建的 Promise 对象。resolve 函数用于将 Promise 状态设置为已完成(Fulfilled),并传递异步操作的结果。reject 函数用于将 Promise 状态设置为已拒绝(Rejected),并传递错误信息。

你需要在执行器函数中编写异步操作的代码。当异步操作成功完成时,你应该调用 resolve(result),其中 result 是异步操作的结果。当异步操作失败时,你应该调用 reject(error),其中 error 是表示错误的对象或信息。

使用 Promise 的基本用法如下:

myPromise
  .then(result => {
    // 处理异步操作成功完成的情况
    // result 是异步操作的结果
  })
  .catch(error => {
    // 处理异步操作失败的情况
    // error 是异步操作的错误信息
  });

通过调用 then() 方法,你可以指定当 Promise 转换为已完成状态时要执行的回调函数。如果 Promise 转换为已完成状态,则回调函数将接收异步操作的结果作为参数。

通过调用 catch() 方法,你可以指定当 Promise 转换为已拒绝状态时要执行的错误处理回调函数。如果 Promise 转换为已拒绝状态,则回调函数将接收表示错误的对象或信息作为参数。

使用这种方式,你可以根据 Promise 的不同状态来处理异步操作的结果或错误,并按需执行相应的代码逻辑。

4. 解释 Promise 的链式调用(chaining)和方法的执行顺序。

Promise 的链式调用是一种在多个 Promise 之间链接操作的方式,通过返回新的 Promise 对象实现。它允许你按顺序执行一系列的异步操作,并且可以在每个操作中处理结果或错误,从而实现更加优雅和可读的异步代码。

在 Promise 链式调用中,每个 then() 方法都返回一个新的 Promise 对象,它代表了前一个操作的结果。你可以在这个新的 Promise 上调用另一个 then() 方法,以便继续下一个操作,如此类推。这样就形成了 Promise 链。

下面是一个简单的例子来说明 Promise 链式调用的概念:

const promise = asyncOperation()
  .then(result1 => {
    // 对结果 result1 进行处理,并返回一个新的值
    return processResult1(result1);
  })
  .then(result2 => {
    // 对结果 result2 进行处理,并返回一个新的值
    return processResult2(result2);
  })
  .catch(error => {
    // 处理错误情况
    console.error(error);
  });

在上述代码中,asyncOperation() 是一个返回 Promise 的异步操作函数。通过在 then() 方法中处理每个结果,并返回一个新值,我们将结果传递给下一个 then() 方法。如果任何一个操作失败(Promise 转为已拒绝状态),则会跳过后续的 then() 方法,直接执行最近的 catch() 方法。

方法的执行顺序如下:

  1. 首先,第一个操作 asyncOperation() 被执行,并返回一个 Promise 对象。
  2. 当第一个操作成功完成时(Promise 转为已完成状态),第一个 then() 方法中的回调函数被调用,并传递成功的结果 result1
  3. 第一个 then() 方法中的回调函数处理 result1,根据需要返回一个新的值。
  4. 新的 Promise 对象被返回,表示第一个 then() 方法的处理结果。
  5. 如果存在后续的 then() 方法,它们会在前一个 then() 方法返回的 Promise 对象上继续调用。
  6. 每个 then() 方法中的回调函数按顺序执行,处理前一个操作的结果并返回新的 Promise 对象。
  7. 如果任何一个操作失败(Promise 转为已拒绝状态),后续的 then() 方法会被跳过,直到最近的 catch() 方法被执行。
  8. 如果没有发生错误,最后一个 then() 方法执行完成后,整个 Promise 链式调用结束。

通过 Promise 的链式调用,我们可以更清晰地表达出异步操作之间的依赖关系,并在每个操作中处理结果或错误。这使得异步代码更易于编写和理解,并且避免了回调地狱(callback hell)的问题。

5. 解释 Promise 的错误处理机制以及如何在链式调用中捕获错误。

在 Promise 中,错误处理通过 catch() 方法来实现。catch() 方法附加在 Promise 链的末尾,用于捕获之前任何一个操作中发生的错误。

在链式调用中,如果前面的操作(Promise)转为已拒绝状态,那么后续的 then() 方法都会被跳过,直接执行最近的 catch() 方法。这使得我们可以在链中的任何地方捕获错误,并对其进行适当的处理。下面是一个示例代码:

asyncOperation()
  .then(result => {
    // 处理操作成功的情况
  })
  .catch(error => {
    // 处理发生的错误
  });

在上述代码中,catch() 方法附加在 Promise 链的末尾,用于捕获之前任何一个操作中发生的错误。如果在任何一个操作中发生错误(Promise 转为已拒绝状态),那么控制流将会跳转到最近的 catch() 方法,并传递错误对象给它。

在实际应用中,你可以根据具体情况在 catch() 方法中处理错误。例如,你可以打印错误信息、记录日志、向用户显示错误消息等。

另外,还可以使用多个 catch() 方法来对不同类型的错误进行处理。这样,每个 catch() 方法都有机会捕获不同类型的错误,并提供特定的错误处理逻辑。

下面是一个示例代码,演示了如何在 Promise 链式调用中捕获和处理不同类型的错误:

asyncOperation()
  .then(result => {
    // 处理操作成功的情况
  })
  .catch(error => {
    if (error instanceof TypeError) {
      // 处理类型错误
    } else if (error instanceof RangeError) {
      // 处理范围错误
    } else {
      // 处理其他类型的错误
    }
  });

在上述代码中,我们使用了 instanceof 运算符来判断错误对象的类型,并根据不同的类型执行相应的错误处理逻辑。

总结起来,Promise 的错误处理机制通过 catch() 方法来捕获链中任何一个操作中发生的错误。这使得我们能够更好地控制和处理异步操作中可能出现的错误情况。

6. Promise.resolve() 和 Promise.reject() 的作用是什么?

Promise.resolve() 和 Promise.reject() 是两个静态方法,用于创建已经解析或已经拒绝的 Promise 对象。

  1. Promise.resolve(value) 方法返回一个已经解析(已完成)的 Promise 对象,并将给定的值作为解析结果。如果传递的值是一个 Promise 对象,则该方法会直接返回这个 Promise 对象,而不会创建新的 Promise。

    Promise.resolve("成功").then(result => {
      console.log(result); // 输出:"成功"
    });
    
  2. Promise.reject(reason) 方法返回一个已经拒绝的 Promise 对象,并将给定的原因作为拒绝理由。通常情况下,参数 reason 是一个 Error 对象,用于表示发生的错误。与 Promise.resolve() 方法类似,如果传递的原因是一个 Promise 对象,该方法也会直接返回这个 Promise 对象。

    Promise.reject(new Error("出错了")).catch(error => {
      console.error(error); // 输出:Error: 出错了
    });
    

这两个方法在某些情况下非常有用,可以快速创建已经解析或已经拒绝的 Promise 对象。比如,当你需要在异步操作之前立即返回一个已知的结果时,可以使用 Promise.resolve() 方法。类似地,当你需要在异步操作之前立即返回一个已知的错误时,可以使用 Promise.reject() 方法。

此外,Promise.resolve() 方法还可以将其他类型的值(非 Promise 对象)转换为解析状态的 Promise 对象。这样可以方便地将异步操作和同步操作统一使用 Promise 的方式处理。

7. 解释 Promise.all() 和 Promise.race() 的区别和用途。

Promise.all() 和 Promise.race() 是两个与多个 Promise 对象相关的方法,它们有不同的特点和用途。

  1. Promise.all(iterable) 方法接收一个可迭代对象,例如数组,里面包含了多个 Promise 对象,并返回一个新的 Promise 对象。这个新的 Promise 对象在所有给定的 Promise 对象都已经解析(已完成)时才会被解析,解析值是一个数组,包含了每个 Promise 的解析结果。如果其中任何一个 Promise 被拒绝(已失败),那么这个新的 Promise 对象也会被拒绝,并使用被拒绝的 Promise 的拒绝原因。

    const promise1 = Promise.resolve(1);
    const promise2 = Promise.resolve(2);
    const promise3 = Promise.resolve(3);
    
    Promise.all([promise1, promise2, promise3]).then(results => {
      console.log(results); // 输出:[1, 2, 3]
    });
    

    Promise.all() 方法非常有用,当你需要同时等待多个异步操作完成,并在它们都完成后执行一些操作时使用。例如,当你需要从多个 API 请求中获取数据,然后进行进一步处理时,可以使用 Promise.all() 方法将这些 API 请求封装成 Promise,并在它们都完成后执行下一步操作。

  2. Promise.race(iterable) 方法接收一个可迭代对象,里面包含了多个 Promise 对象,并返回一个新的 Promise 对象。这个新的 Promise 对象在给定的 Promise 对象中有任何一个解析或拒绝时就会解析或拒绝。

    const promise1 = new Promise(resolve => setTimeout(() => resolve(1), 1000));
    const promise2 = new Promise((resolve, reject) => setTimeout(() => reject(new Error("出错了")), 500));
    
    Promise.race([promise1, promise2]).then(result => {
      console.log(result); // 输出:1
    }).catch(error => {
      console.error(error); // 不会执行,因为 promise1 解决得更快
    });
    

    Promise.race() 方法的用途在于,当你只关心最快/最早解决的 Promise 对象,并希望根据该 Promise 对象的状态执行相应的操作时使用。例如,当你需要获取多个请求的响应时间,并根据最先响应的请求执行不同的逻辑时,可以使用 Promise.race() 方法。

总结起来,Promise.all() 方法将多个 Promise 对象封装成一个新的 Promise 对象,等待所有 Promise 完成后解析。而 Promise.race() 方法将多个 Promise 对象封装成一个新的 Promise 对象,等待其中一个 Promise 解析或拒绝后立即解析或拒绝。它们分别适用于等待多个 Promise 同时完成或仅关注最快完成的情况下的处理。

8. 怎样使用 async/await 结合 Promise 进行异步操作的处理?

使用 async/await 结合 Promise 可以更方便地进行异步操作的处理。下面是使用 async/await 处理异步操作的一般步骤:

  1. 定义一个包含异步操作的函数,并在函数声明前加上 async 关键字。这个函数可以包含多个异步操作,每个异步操作可以是 Promise 对象、返回 Promise 对象的函数等。

    async function fetchData() {
      // 异步操作
    }
    
  2. 在函数内部使用 await 关键字来等待一个 Promise 对象的解析结果。await 只能在 async 函数内部使用。当遇到 await 语句时,执行会暂停,直到这个 Promise 对象解析为止,并返回解析结果。

    async function fetchData() {
      const result = await promise;
      console.log(result); // 输出:Promise 解析的结果
    }
    
  3. 使用 try-catch 块来捕获可能发生的错误。可以将异步操作放在 try 块中,然后捕获 catch 块中的错误。

    async function fetchData() {
      try {
        const result = await promise;
        console.log(result);
      } catch (error) {
        console.error(error);
      }
    }
    
  4. 调用异步函数时可以直接使用 await 关键字等待其完成,并获取最终结果。

    async function main() {
      try {
        const data = await fetchData();
        // 处理获取到的数据
      } catch (error) {
        // 处理错误情况
      }
    }
    
    main();
    

使用 async/await 可以让异步代码看起来更像同步代码,提高代码的可读性和维护性。注意,在使用 async/await 时,还是需要依赖 Promise 对象来实现异步操作的管理和处理。

9. Promise 中的回调函数和 then() 方法哪个会先执行?

在 Promise 中,回调函数和 then() 方法的执行顺序是有区别的。

  1. 回调函数会在异步操作的最终结果(解决或拒绝)被确定后执行。在创建 Promise 对象时,我们可以将解决和拒绝结果的处理逻辑作为回调函数传递给 Promise 构造函数。

    const promise = new Promise((resolve, reject) => {
      // 异步操作
      // 最终调用 resolve(result) 或 reject(error)
    });
    
    promise.then(result => {
      // 在结果解决时执行
    }, error => {
      // 在结果拒绝时执行
    });
    

    回调函数会在 Promise 对象的状态转换为已解决或已拒绝时被调用,并且只会执行其中的一个回调函数,根据 Promise 的状态调用相应的函数。

  2. then() 方法则是用于注册在 Promise 对象解析时执行的回调函数。这些回调函数会在 Promise 对象解析成功后按照注册的顺序被依次执行。

    const promise = new Promise((resolve, reject) => {
      // 异步操作
      // 最终调用 resolve(result)
    });
    
    promise.then(result => {
      // 第一个 then() 的回调函数
    }).then(() => {
      // 第二个 then() 的回调函数
    });
    

    then() 方法中的回调函数在前一个 then() 方法中返回的 Promise 对象被解析后执行。它们会按照注册的顺序依次执行,形成了 Promise 链。

综上所述,回调函数会在最终结果确定(解决或拒绝)后被执行,而 then() 方法中的回调函数会按照注册的顺序在 Promise 解析成功后执行。因此,回调函数的执行时间由操作的结果确定,而 then() 方法中的回调函数的执行则受之前的 Promise 对象解析状态的影响。

10. 怎样在多个 Promise 中进行顺序执行和并发执行?

在多个 Promise 中进行顺序执行或并发执行可以通过不同的方法来实现。

  1. 顺序执行:

    顺序执行是指按照特定的顺序依次执行多个 Promise,其中每个 Promise 都依赖于前一个 Promise 的结果。可以使用 then() 方法或 async/await 来实现。

    使用 then() 方法:

    const promise1 = new Promise((resolve, reject) => {
      // 异步操作
    });
    
    promise1.then(result1 => {
      // 处理结果1
      return new Promise((resolve, reject) => {
        // 异步操作
      });
    }).then(result2 => {
      // 处理结果2
      return new Promise((resolve, reject) => {
        // 异步操作
      });
    }).then(result3 => {
      // 处理结果3
    }).catch(error => {
      // 错误处理
    });
    

    使用 async/await:

    async function sequentialExecution() {
      try {
        const result1 = await promise1;
        // 处理结果1
    
        const result2 = await promise2;
        // 处理结果2
    
        const result3 = await promise3;
        // 处理结果3
      } catch (error) {
        // 错误处理
      }
    }
    
    sequentialExecution();
    
  2. 并发执行:

    并发执行是指多个 Promise 同时执行,不需要等待前一个 Promise 完成。可以使用 Promise.all() 方法或 async/await 结合 Promise.all() 来实现。

    使用 Promise.all() 方法:

    const promises = [
      new Promise((resolve, reject) => {
        // 异步操作 1
      }),
      new Promise((resolve, reject) => {
        // 异步操作 2
      }),
      new Promise((resolve, reject) => {
        // 异步操作 3
      })
    ];
    
    Promise.all(promises)
      .then(results => {
        // 处理所有结果
      })
      .catch(error => {
        // 错误处理
      });
    

    使用 async/await 结合 Promise.all()

    async function concurrentExecution() {
      try {
        const results = await Promise.all([
          promise1,
          promise2,
          promise3
        ]);
        // 处理所有结果
      } catch (error) {
        // 错误处理
      }
    }
    
    concurrentExecution();
    

顺序执行和并发执行可以根据具体需求来选择。顺序执行适合于多个 Promise 之间有依赖关系的情况,而并发执行适合于多个 Promise 之间相互独立的情况。

附录:前后端实战项目(简历必备) 推荐:★★★★★

Vue.js 和 Egg.js 开发企业级健康管理项目
带你从入门到实战全面掌握 uni-app

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/725532.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RabbitMQ系列(13)--Direct交换机的简介与实现

1、Direct交换机的介绍 Direct交换机能让消息只发送往绑定了指定routingkey的队列中去,值得注意的是当绑定多个队列的routingkey都相同,则这种情况下的表现与Fanout交换机的类似 2、Direct交换机的实现 (1)新建一个名为fanout的包,用于装发…

QT6在线下载安装慢的问题

由于某“墙”的原因,在国内安装QT是会要了老命的,下载只有几十K,安装QT6保守估计得按天计算了。 经过多次尝试,终于找到了可以“几十MB”速度下载安装的办法。 方法一: qt-unified-windows-x64-4.5.2-online.exe --…

leetcode:移动零

移动零 easy 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums […

回归预测 | MATLAB实现BES-LSSVM秃鹰算法优化最小二乘支持向量机多输入单输出

回归预测 | MATLAB实现BES-LSSVM秃鹰算法优化最小二乘支持向量机多输入单输出 目录 回归预测 | MATLAB实现BES-LSSVM秃鹰算法优化最小二乘支持向量机多输入单输出预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现BES-LSSVM秃鹰算法优化最小二乘支持向量机多输入…

如何用深度强化学习自动炒股

初衷 最近一段时间,受到新冠疫情的影响,股市接连下跌,作为一棵小白菜兼小韭菜,竟然产生了抄底的大胆想法,拿出仅存的一点私房钱梭哈了一把。 第二天,暴跌,俺加仓 第三天,又跌&…

【PCL】(二)CMake编译

&#xff08;二&#xff09;CMake编译 将以下代码写到pcd_write.cpp中&#xff0c;并放到项目/PATH/TO/MY/GRAND/PROJECT/project中。 #include <iostream>#include <pcl/io/pcd_io.h>#include <pcl/point_types.h>intmain (){pcl::PointCloud<pcl::Poin…

黑马头条 作业+解答 day03-自媒体文章发布 自媒体接口

感觉是非常适合新手的练手接口&#xff1b;花了不到半小时吧&#xff0c;主要是因为接口描述很清晰&#xff01; 建议大家仔细自己做了一遍再对照&#xff0c;有更好的写法欢迎留言&#xff01; 1)素材管理 1.1)图片删除 接口描述 说明接口路径/api/v1/material/del_picture/{i…

分布式事务 微服务事务方案和实现 Java分布式事务架构知识点

文章目录 什么是分布式事务分布式的理论的角度看分布式事务的体系刚性事务&#xff1a;柔性事务&#xff1a;两段提交&#xff08;2PC&#xff09;两段提交&#xff08;2PC - Prepare & Commit&#xff09;是指两个阶段的提交&#xff1a;两段提交&#xff08;2PC&#xff…

这些ai自动生成图片软件你值得拥有

小明是一名设计师&#xff0c;最近他接到了一份海报设计的任务。但是&#xff0c;他却发现自己的设计能力有些瓶颈&#xff0c;无法满足客户的需求。就在他苦恼之时&#xff0c;他的朋友小王向他建议了了几款趁手的ai绘画工具&#xff0c;可以帮助它快速绘制出美轮美奂的图片。…

什么是 AOP?对于 Spring IoC 和 AOP 的理解?

什么是 AOP&#xff1f; AOP(Aspect-Oriented Programming)&#xff0c;即 面向切面编程&#xff0c; 它与OOP( ObjectOriented Programming, 面向对象编程) 相辅相成&#xff0c;提供了与OOP 不同的抽象软件结构的视角 在 OOP 中, 我们以类(class)作为我们的基本单元 而 A…

微服务网关SpringCloudGateway实战

目录 微服务网关SpringCloudGateway 1.概述 2.核心概念 快速入门 1.微服务开发 2.网关配置创建一个Gateway服务&#xff0c;引入以下依赖&#xff1a; 微服务网关SpringCloudGateway 1.概述 Spring cloud gateway是spring官方基于Spring 5.0、Spring Boot2.0和Project R…

K8S集群安全升级(CIS CNI Calico)

集群安全升级 1 集群安全升级1.1 环境安全1.1.1 CIS基础1.1.2 测试工具1.1.3 组件测试1.1.4 定制测试1.1.5 测试镜像 1.2 网络安全1.2.1 CNI方案1.2.2 Calico环境1.2.3 Calico部署1.2.4 简单实践1.2.5 BGP实践1.2.6 策略实践1.2.7 流量管控1.2.8 基准测试 1 集群安全升级 1.1 …

怎样成为平面设计师?一文带你快速了解

成为一名优秀的平面设计师需要具备一定的条件和能力&#xff0c;同时也需要与行业的发展趋势保持密切的联系。本文将深入探讨成为一名优秀的平面设计师所需的条件&#xff0c;帮助你成为一名优秀的平面设计师。 1、掌握平面设计工具 是否能熟练掌握设计工具和软件是成为优秀平…

物理层概述(一)

物理层基本概念 在计算机网络中&#xff0c;用来连接计算机的媒体大概可以分为两种&#xff1a; 1.导引型传输媒体 双绞线&#xff0c;同轴电缆&#xff0c;光纤 2.非导引型传输媒体 微波通信&#xff08;2~40GHz&#xff09; 物理层协议的主要任务&#xff1…

C++核心编程之引用的使用与介绍

目录 一、引用的基本语法 引用介绍 引用说明 二、引用的注意事项 三、引用做函数参数 四、引用做函数的返回值 五、引用的本质 六、常量引用 一、引用的基本语法 引用介绍 C是C语言的继承&#xff0c;它可进行过程化程序设计&#xff0c;又可以进行以抽象数据类型为特…

(Docker) Compose Plugin For OMV6

omv6:omv6_plugins:docker_compose [omv-extras.org] Summary概述 Docker is a technology that enables the creation and use of Linux containers. A container is a closed environment where one or more applications and their dependencies are installed, grouped and…

浏览器种输入一个url到显示页面全过程

所谓的‘三颗树’ 在浏览器中&#xff0c;当解析和加载网页时&#xff0c;会形成三个重要的树结构&#xff1a;DOM树、CSSOM树和渲染树&#xff08;Render Tree&#xff09;。这些树结构在网页的渲染和布局过程中起到关键作用。 DOM树&#xff08;Document Object Model Tree&…

亿发软件:释放智能仓储的力量,WMS智能仓储管理系统提升动态储存

在仓储管理领域&#xff0c;智能仓储的概念已经成为游戏规则的改变者。借助信息化、物联网和机电一体化的力量&#xff0c;智能仓库正在给行业带来变化。这些先进设施显著增加了仓储管理能力。在本文中&#xff0c;我们将探讨智能仓库的关键优势&#xff0c;了解采用WMS智能仓储…

【文生图系列】文生图大模型合集与效果对比

文章目录 DELL EDELL E 1DELL E 2 ERNIE-ViLGERNIE-ViLG 1ERNIE-ViLG 2Paddlehub ImagenMidjourneyStable DiffusionAltDiffusioneDiff-I阿里通义 DELL E DALLE到目前为止有两个版本&#xff0c;2021年1月&#xff0c;OpenAI发布了DALLE&#xff1b;2022年,DALLE 迎来了升…

Jersey框架学习

一、入门 controller package com.itheima.controller;import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType;Path("/person") public class PersonResource {GETProduces(MediaType.TEXT_PLAIN)pub…