快速入门JavaScript异步编程:从回调到async/await的跨越

在这里插入图片描述

文章目录

  • I. 介绍
    • 异步编程的背景和基本概念
    • 本文主要讨论JavaScript中的异步编程
  • II. 回调函数
    • 回调函数的定义、作用以及使用场景
    • 回调地狱的问题及解决方案
  • III. Promise
    • Promise的定义、作用以及使用场景
    • Promise的状态及状态转换
    • Promise的链式调用和错误处理
  • IV. async/await
    • async/await的定义、作用以及使用场景
    • async/await与Promise的关系
    • async/await的优缺点及适用场景
  • V. Event Loop
    • Event Loop的概念、作用及实现原理
    • Event Loop与JavaScript异步编程的关系
    • 常见的Event Loop相关问题及解决方案
  • VI. 总结
    • 异步编程的重要性及优缺点总结
    • 不同的异步编程方式的适用场景比较
    • 异步编程最佳实践及注意事项

I. 介绍

异步编程的背景和基本概念

在计算机科学中,异步编程是一种处理非阻塞IO的编程模型。这种编程模型基于事件循环机制,可以在等待IO操作完成的同时,继续执行其他任务,从而使程序不会被长时间阻塞。异步编程已经成为现代编程语言中的重要特性,例如JavaScript、Python、Java等。

经典的同步编程在等待某个操作完成时,程序会被阻塞住,直到操作完成。而异步编程则不同,它可以在等待某个操作的同时,继续执行后续任务等待操作完成后再将回调函数加入事件队列中。因此,异步编程中将任务和回调函数分离开来,即在提交任务时,同时指定操作完成时要执行的回调函数。

异步编程可以提高程序的效率,尤其是在处理网络IO时。例如,一个Web服务器可以在响应一个请求时等待同步操作完成,也可以使用异步编程模型来处理多个请求,使得程序效率更高、响应更及时。在JavaScript中,我们常用的异步编程技术包括回调函数、Promise、async/await等。

本文主要讨论JavaScript中的异步编程

以下是本文中JavaScript异步编程的常用技术及其主要特点的表格总结:

异步编程技术主要特点
回调函数将回调函数作为参数传递给函数,等待操作完成
Promise使用then/catch方法实现链式调用,处理错误
async/await使用async/await语法糖更轻松地处理异步操作
Event Loop基于事件驱动机制,实现异步编程的基础

这些异步编程技术都有各自的优缺点和适用场景,我们需要根据具体问题选择合适的技术。例如,在需要处理多个异步操作的复杂场景中,Promise链式调用的方式可以更加直观,而在简单的异步操作中,使用回调函数则可以更加方便。异步编程在JavaScript中是非常重要的,了解这些技术的特点及其使用方法可以帮助我们更好地编写高效的异步代码。

II. 回调函数

回调函数的定义、作用以及使用场景

回调函数是一种常见的JavaScript异步编程技术。它的定义是:将函数作为参数传递给其他函数,当该函数的操作完成时,调用传入的参数函数。回调函数可以用于处理各种异步操作,例如读取文件、发送网络请求、处理定时器等。

回调函数的作用是使JavaScript程序可以在等待异步操作完成时,继续执行其他任务。当异步操作完成时,回调函数将被加入事件队列中,在JavaScript引擎空闲时执行。回调函数可以处理异步操作的结果,例如读取文件的内容、网络请求的响应等。

回调函数适用于一些简单的异步操作,例如启动一个定时器、判断两个数字的大小等。在复杂的异步操作中,回调函数可能导致代码的阅读和维护变得困难。此外,如果需要执行多个异步操作,使用回调函数可能会导致回调地狱问题,即回调嵌套在回调中,在代码阅读和维护时很难处理。因此,回调函数更适用于一些简单且不太频繁的异步操作。

回调地狱的问题及解决方案

回调地狱是指在复杂的异步操作中,回调函数嵌套过多,导致代码难以理解和维护的一种现象。回调地狱的问题在于,每个异步操作后的回调都可能是另一个异步操作,导致代码的缩进层数不断增加,并且难以处理异常情况。这样的代码不仅难以阅读和维护,而且容易产生bug。

解决回调地狱的方案有多种,以下是其中的一些:

  1. 使用Promise对象,将异步操作封装为Promise,避免回调函数的嵌套。

  2. 使用async/await语法糖,可以更加直观地编写异步代码,并避免回调地狱问题。

  3. 使用事件发布/订阅机制,将异步操作发布为事件,订阅该事件的代码即可处理操作结果。

  4. 使用Generator函数,可以在需要等待异步操作时暂停函数执行,并在异步操作完成后恢复执行。

  5. 使用第三方库,例如async.js或q.js等,提供了许多异步操作的封装和优化方法,使得异步代码更容易编写和理解。

这些解决方案都有各自的优点和缺点,需要根据具体的开发需求选择合适的解决方案。在实际开发中,我们应该注重代码的可读性和可维护性,尽可能避免回调地狱问题。

III. Promise

Promise的定义、作用以及使用场景

Promise是一种JavaScript异步编程的技术,它可以简化异步代码的编写,并解决回调地狱问题。Promise的定义是:一个表示异步操作最终完成或失败的对象。它可以在异步操作返回结果时执行相关的回调函数。Promise对象有三种状态:

  • 等待态(Pending)
  • 完成态(Fulfilled)
  • 拒绝态(Rejected)。

Promise主要的作用是让我们更加优雅地处理异步操作的结果,并且避免回调地狱的问题。在使用Promise时,我们可以使用then方法或catch方法处理异步操作完成后的结果,而不用像使用回调函数一样进行回调嵌套。

Promise适用于深度嵌套的异步操作,例如读取多个文件或者处理多个数据库请求。在这种情况下,使用Promise可以避免回调地狱问题,使代码更加清晰和易于维护。Promise也可以方便地进行异步流程控制,例如在多个异步操作完成后执行某个函数或进行下一步操作。

使用Promise的基本流程如下:

  1. 创建一个Promise对象,用来封装异步操作

  2. Promise对象上调用then方法,将回调函数作为参数传递进去。

  3. 异步操作完成后,Promise对象的状态变为完成态(Fulfilled),then方法中指定的回调函数将被执行。

  4. 在回调函数中,我们可以处理异步操作的结果,并且返回一个新的Promise对象,用来处理下一步的异步操作。

  5. 可以在新的Promise对象上继续调用then方法或catch方法,处理下一步异步操作的结果或处理异常情况。

除了then方法和catch方法外,Promise还提供了其他一些有用的方法,例如Promise.allPromise.race

  • Promise.all可以等待多个异步操作全部完成后执行回调函数
  • Promise.race则可以在多个异步操作中任意一个完成时就执行回调函数。

总之,Promise是一种优秀的JavaScript异步编程技术,它可以使异步代码更加清晰和易于维护。在实际开发中,我们应该尽可能使用Promise来处理异步操作。

Promise的状态及状态转换

Promise对象有三种状态:

  • 等待态(Pending)
  • 完成态(Fulfilled)
  • 拒绝态(Rejected)

当创建Promise对象时,初始状态为等待态,在异步操作的结果返回后,Promise对象的状态将转换为完成态或拒绝态。一旦Promise对象的状态确定,它就不会再发生改变。

下面是Promise对象的状态及状态转换的详细说明:

  1. 等待态(Pending):Promise对象的初始状态,即异步操作还未完成。此时,Promise对象可以理解为处于“等待中”的状态,等待异步操作的结果返回。

  2. 完成态(Fulfilled):当异步操作完成且成功时,Promise对象的状态将转换为完成态。同时,Promise对象的then方法中的回调函数将被调用,处理异步操作的结果。完成态的Promise对象的状态转换完成后,不再允许更改状态。

  3. 拒绝态(Rejected):当异步操作完成且失败时,Promise对象的状态将转换为拒绝态。同时,Promise对象的catch方法中的回调函数将被调用,用来处理异步操作失败的情况。拒绝态的Promise对象的状态转换完成后,不再允许更改状态。

总之,Promise对象的状态及状态转换是异步编程的核心,理解这些概念可以帮助我们更好地使用Promise来处理异步操作。在实际开发中,我们应该根据具体的需求处理异步操作的结果,并避免过多地处理异常情况,以保证代码的可读性和可维护性。

Promise的链式调用和错误处理

Promise可以通过链式调用来处理多个异步操作,使代码更加易于阅读和维护。链式调用中每个then方法是一个独立的步骤,用于处理上一步异步操作的结果,并返回一个新的Promise对象,用于处理下一步异步操作的结果。同时,Promise还提供了catch方法,用来处理链式调用过程中的异常情况。

下面是Promise的链式调用和错误处理的示例代码:

getUserId()
  .then((userId) => getUserInfo(userId))
  .then((userInfo) => verifyUserInfo(userInfo))
  .then(() => {
    // 所有异步操作完成后执行的回调函数
  })
  .catch((err) => {
    // 异步操作或链式调用过程中出现异常时执行的回调函数
  });

在上面的示例中,我们使用了几个then方法来处理多个异步操作的结果,然后在最后一个then方法中处理所有操作完成后的回调函数。如果任何一个异步操作失败了,我们可以使用catch方法来处理异常情况。

在使用Promise时,错误处理非常重要。通常,异步操作的错误信息会被传递给then方法的第二个参数或catch方法,我们可以在这些方法中处理异步操作失败的情况。如果不处理Promise对象的错误信息,那么错误信息可能会被忽略或丢失,对应用程序的安全性和稳定性会造成潜在的威胁。

总之,在使用Promise的链式调用和错误处理时,我们应该注重代码的可读性和可维护性,保证代码的稳定性和安全性。在处理链式调用过程中的异常情况时,我们应该格外注意。

IV. async/await

async/await的定义、作用以及使用场景

async/await是一个JavaScript异步编程的技术,它可以让我们更加方便地编写异步代码,并解决回调地狱的问题。

async/await的定义是:

  • async函数是返回Promise的一个异步函数
  • await用于等待异步函数的执行结果

async/await主要的作用是在编写异步代码时,让我们更加直观和易于阅读,避免了回调式、Promise式异步编程中的“回调地狱”问题。async/await的使用场景包括任何需要编写异步代码的场景,例如网络请求、数据库操作等。

async函数的定义格式如下:

async function foo() {
  // 异步操作
}

在async函数中,我们可以使用await关键字来等待异步操作的结果。await关键字必须在async函数内部使用。它会暂停async函数的执行,等待异步操作完成并返回结果,然后再恢复async函数的执行。

下面是使用async/await语法糖的示例代码:

async function getData() {
  try {
    const response1 = await fetch('https://api.example.com/data1'); // 第一个异步操作
    const data1 = await response1.json(); // 处理第一个异步操作的结果
    const response2 = await fetch(`https://api.example.com/data2?data=${data1}`); // 第二个异步操作
    const data2 = await response2.json(); // 处理第二个异步操作的结果
    return data2; // 返回异步操作的结果
  } catch (error) {
    console.error(error); // 处理错误情况
  }
}

getData()
  .then(data => console.log(data))
  .catch(error => console.error(error));

可以看到,在使用async/await时,代码变得非常直观简洁,没有了Promise和回调函数的嵌套,而且错误处理也非常方便。同时,async/await语法糖也大大降低了异步编程的学习难度。

总之,async/await是JavaScript异步编程的一种技术,它可以让我们更加方便地编写异步代码,并解决回调地狱的问题。在实际开发中,我们应该适时地使用async/await语法糖,提高异步代码的可读性和可维护性。

async/await与Promise的关系

async/await是基于Promise实现的语法糖,它并不是一种新的异步技术,而是对Promise的进一步封装,能够使Promise的语法更加简洁、易读,并且避免了Promise中then和catch方法的回调嵌套问题

实际上,async函数返回的是一个Promise对象,如果async函数内部没有异常情况,则Promise对象状态为resolved,返回async函数的值;如果async函数内部出现异常,则Promise对象状态为rejected,返回异常信息。因此,async/await也遵循Promise的状态和状态转换规则。

下面是一个使用async/await和Promise的示例代码:

async function getData() {
  try {
    const response = await fetch('https://api.example.com/data');
    const data = await response.json();
    return data;
  } catch (err) {
    console.error(err);
  }
}

getData().then(data => console.log(data)).catch(err => console.error(err));

在上面的代码中,我们使用了async/await语法糖来简化异步操作的代码,其中的fetch方法返回了一个Promise对象,而await关键字则等待了Promise对象的状态转变为resolved,并返回Promise对象的结果,以便后续的异步操作使用。

在总体上,async/await使用起来非常直观、简洁、易于阅读和维护。它成为了 Promise API 的一个闪亮的补充,与 Promise 一样,工作在运行时,可以在服务端或者浏览器环境中使用。

async/await的优缺点及适用场景

async/await 作为 Promise API 的一种扩展,与 Promise 一样工作在运行时,并具有以下的优缺点和适用场景:

优点:

  1. 语法简洁、易于阅读和维护,减少了回调嵌套,避免了回调地狱问题
  2. 错误处理更加直观和一致,使用 try/catch 来捕获异步操作中的异常情况。
  3. async/await的性能比Promise略微更高,因为 async/await 可以避免一些额外的 Promise 流程。

缺点:

  1. async/await 不支持并行执行多个异步操作,因为 await 命令必须等待前一个异步命令执行完成才能执行下一个命令。
  2. async/await 无法处理回调函数中的 this 指向问题,需要借助bind或箭头函数来解决。

适用场景:

  1. 在一些需要清晰、易读的异步操作中使用,避免了回调函数的嵌套。
  2. 在需要多个异步操作顺序执行时使用,以便代码简单直观。
  3. 在需要捕获异步操作中的异常情况时使用,减少代码冗余。

总之,在实际应用中,async/await非常适合不需要进行多个异步操作,或者多个异步操作需要串行执行的场景,以及对代码的可读性和可维护性有较高要求的场景。但是,当需要并发执行多个异步操作时,使用 Promise.all 或者 async 函数中配合多个 await 命令来实现。

V. Event Loop

Event Loop的概念、作用及实现原理

Event LoopJavaScript运行时的一个重要概念,它是一个持续运行的循环,用于处理异步事件和回调函数的执行顺序。Event Loop的主要作用是实现JavaScript单线程的异步编程模型,并保证代码的执行顺序。

JavaScript运行环境通常包括两部分,一部分是JavaScript引擎,另一部分是宿主环境,例如Web浏览器或Node.js环境。JavaScript引擎负责解释和执行JavaScript代码,而宿主环境则提供了一些API,用于访问系统资源和处理异步事件。

Event Loop的实现原理通常包括以下几个步骤:

  1. 执行同步任务,例如函数调用和变量赋值等操作,直到调用栈为空。

  2. 从异步事件队列中取出一个事件,并根据事件类型触发相应的回调函数。例如,如果是网络请求完成事件,那么将会触发对应的回调函数。

  3. 将执行完的回调函数放入到回调函数队列中等待执行。

  4. 返回第1步,继续执行同步任务。

Event Loop的作用在于保证JavaScript代码的执行顺序,避免了多线程编程中的竞态条件和死锁问题。通过将所有的异步事件和回调函数添加到事件队列中,JavaScript引擎可以按照事件的顺序依次处理并执行回调函数。这样,就避免了异步事件之间的依赖关系导致代码执行出现问题的情况。

总之,Event Loop是JavaScript的异步编程模型的核心概念,它通过维护一个事件队列来实现异步事件的顺序执行,并保证JavaScript代码的执行顺序。在编写JavaScript程序时,我们应该了解Event Loop的原理和作用,以便更好地理解JavaScript异步编程模型。

Event Loop与JavaScript异步编程的关系

Event Loop是JavaScript异步编程机制的核心。在JavaScript中,由于其单线程的特性,所有的代码都是基于事件驱动的,需要通过异步编程模型来实现。在异步编程模型中,使用回调函数、Promise、async/await等方式实现异步操作,而所有的异步操作都需要通过Event Loop来进行调度和执行。

JavaScript中的Event Loop通过维护一个事件队列来实现异步操作的执行顺序。当发生异步操作或事件时,会将其添加到事件队列中。当主线程上的所有同步代码执行完毕后,Event Loop会取出事件队列中的下一个事件,将其对应的回调函数添加到调用栈中执行。如果事件队列中没有事件,则JavaScript引擎会等待新的事件的添加。

JavaScript中的异步编程机制通常基于回调函数,例如通过setTimeout/setIntervalXMLHttpRequestfetch等方式来实现。在这些异步操作中,回调函数通常会在异步操作完成后被触发执行。通过将这些回调函数添加到事件队列中,Event Loop可以保证异步操作的执行顺序,并避免出现竞态条件和死锁等问题。

总之,Event Loop是JavaScript异步编程机制的核心,通过维护一个事件队列来实现异步操作的顺序执行,并保证JavaScript代码的执行顺序。在实际开发中,了解Event Loop的原理和作用非常重要,可帮助开发人员更加深入地理解JavaScript的异步编程模型,从而编写高效、可靠的代码。

常见的Event Loop相关问题及解决方案

在Web开发中,Event Loop常常出现各种问题,下面是一些常见的Event Loop相关问题以及解决方案:

1. 什么是Event Loop?
答:Event Loop是JavaScript的异步编程模型的核心机制,它通过维护一个事件队列来实现异步操作的执行顺序。

2. 什么是回调地狱(callback hell)?
答:回调地狱是指过多的嵌套回调函数导致代码难以理解和维护的现象。解决方案是使用Promiseasync/await等异步编程模型来简化异步操作的代码。

3. 如何避免循环中的异步操作导致的问题?
答:可以使用循环迭代赋值的方式,来避免异步操作内部的变量共享问题。例如,在循环中使用let来声明变量。

4. 如何避免事件触发的频繁回调导致的问题?
答:可以使用throttledebounce来避免频繁的事件回调。throttle可以确保回调函数在一定时间内只被执行一次,而debounce则可以确保回调函数在短时间内只被执行一次,适用于需要等待用户操作完毕后执行的场景。

5. 如何避免异步回调函数的执行顺序问题?
答:可以使用Promise.all或async/await等方式来避免异步回调函数执行顺序问题,以确保异步操作完成后再进行下一步操作。

总之,在Web开发过程中,Event Loop相关问题常常会出现。了解这些问题的解决方案,可以帮助开发人员更好地掌握异步编程模型,避免代码错误和性能问题的出现。同时也可以通过选择更好的异步编程模型,例如async/await,来写出更加简洁、可读、可维护的代码。

VI. 总结

异步编程的重要性及优缺点总结

异步编程是现代Web开发中非常重要的一部分,下表总结了异步编程的优缺点:

优点缺点
提高程序性能可能会导致代码复杂度增加
提高用户体验可能会影响代码的可读性和可维护性
避免阻塞主线程可能会出现回调地狱等问题
提高代码的可扩展性和可重用性在调试和错误处理方面可能会更加困难

异步编程的优缺点总结如下:

优点:

  1. 提高程序性能:通过异步编程,可以避免阻塞主线程,提高程序的响应速度和处理能力。
  2. 提高用户体验:可以提高页面的加载速度和交互响应速度,提高用户的满意度和用户体验。
  3. 避免阻塞主线程:异步操作的执行不会阻塞主线程,避免了整个页面被挂起的情况。
  4. 提高代码的可扩展性和可重用性:异步编程模型可以帮助我们编写更可扩展的代码,充分利用系统资源。

缺点:

  1. 可能会导致代码复杂度增加:使用异步编程需要处理回调函数或Promise等异步操作,这会增加代码的复杂度。
  2. 可能会影响代码的可读性和可维护性:异步编程可能会导致回调地狱等问题,影响代码的可读性和可维护性。
  3. 在调试和错误处理方面可能会更加困难:异步编程中的回调函数和Promise会让错误处理变得更加困难,需要更加谨慎地处理错误。

总之,异步编程是现代Web开发中必要的一部分,要根据具体的场景选择适当的异步编程模型,在避免阻塞主线程和提高用户体验的同时,要注意代码的可读性、可维护性和错误处理。

不同的异步编程方式的适用场景比较

不同的异步编程方式在使用场景上有所差异,下表总结了常见的异步编程方式及其适用场景比较:

异步编程方式适用场景
回调函数适用于简单的异步操作,例如定时器和事件监听等场景。
Promise适用于需要串联多个异步操作的场景,例如多个网络请求之间的依赖关系。
async/await适用于需要顺序执行多个异步操作,并且需要在执行过程中方便地处理异常和错误的场景。
Generator适用于维护异步操作的状态,例如流式处理和状态机等场景。
RxJS适用于大规模数据流处理的场景,例如数据可视化和复杂的用户交互场景。

不同的异步编程方式在使用场景上适合的情况不同,需要根据具体的业务场景来选择适合的方式。例如,对于简单的异步操作,通常可以使用回调函数来实现;对于多个异步操作之间有依赖关系的场景,可以使用Promise来串联异步操作;对于需要方便地处理异常和错误的场景,可以使用async/await;对于需要维护异步操作的状态的场景,可以使用Generator等方式实现。

总之,在选择异步编程方式时,需要综合考虑业务需求、性能和代码复杂度等因素。同时,不同的异步编程方式也有其独特的优势和适用场景,需要在具体场景下进行选择和使用。

异步编程最佳实践及注意事项

异步编程在现代Web开发中非常重要,下面总结了一些异步编程的最佳实践和注意事项:

  1. 尽量避免回调地狱(callback hell),使用Promise或async/await等异步编程模型简化代码。
  2. 在使用异步操作之前,需要确保理解异步操作的运行机制和内部实现,避免出现错误和性能问题。
  3. 对于多个异步操作之间存在依赖关系的场景,使用Promise.all或async/await等方式串联异步操作,减少代码的嵌套和复杂度。
  4. 在异步操作中,要正确处理异常和错误,使用try-catch语句或catch()方法来捕获错误,并及时处理和提示用户。
  5. 在异步操作过程中,需要注意防止竞态条件和数据竞争问题;
  6. 在异步操作涉及到跨域请求的情况下,一定要加上跨域头Access-Control-Allow-Origin,防止请求被拒绝。

总之,异步编程在Web开发中非常重要,开发人员需要了解异步编程的运行机制、使用方法和最佳实践,避免出现性能问题、代码错误和安全漏洞等问题。同时,在使用异步编程时要注重代码的可读性、可维护性和安全性,加强对异常和错误的处理和提示,以提高代码质量和用户体验。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

B049-cms04-浏览次数 富文本 轮播图 上传

目录 浏览次数页面加载发送请求后台处理请求前台展示 展示日期富文本编辑static下引入富文本资源文件夹模态框文本域替换成如下内容底部引入相关文件调整模态框样式把富文本选项移到模态框前面上传表情或图片等富文本添加操作手动清空富文本编辑器内容修改操作手动回显富文本编…

浅析 Jetty 中的线程优化思路

作者:vivo 互联网服务器团队- Wang Ke 本文介绍了 Jetty 中 ManagedSelector 和 ExecutionStrategy 的设计实现,通过与原生 select 调用的对比揭示了 Jetty 的线程优化思路。Jetty 设计了一个自适应的线程执行策略(EatWhatYouKill&#xff09…

华为eNSP入门实验,Vlan配置,路由配置,用户模式,链路聚合

文章目录 一、同一交换机下的PC通信二、不交换机下的PC通信三、配置静态路由通信四、路由器rip协议配置五、路由器ospf协议配置六、单臂路由七、通过三层交换机使不同的Vlan能连通八、设备consolo密码模式九、设备consolo用户密码模式(AAA模式)十、Telne…

运算放大器(一):电压跟随器

一、电压跟随器 电压跟随器(单位增益放大器、缓冲放大器或隔离放大器)是一种电压放大倍数为 1 的运算放大器,能够将输入信号的电压放大到同样的幅度并输出,同时保持输入输出电阻不变(电压跟随器的输入电阻很大&#x…

【后端】SSM框架下REST风格代码注释详解

前言 最近学习了一下SSM,不得不说,spring不用注解真的是天打雷劈,就那个bean真的就是折磨人。 下面是我总结的spring注解。 Value 此注解可以用来获取导入的jdbc.properties文件的值。 Value("${jdbc.driver}")private String…

(论文阅读)Chain-of-Thought Prompting Elicits Reasoning in Large Language Models

论文地址 https://openreview.net/pdf?id_VjQlMeSB_J 摘要 我们探索如何生成一个思维链——一系列中间推理步骤——如何显著提高大型语言模型执行复杂推理的能力。 特别是,我们展示了这种推理能力如何通过一种称为思维链提示的简单方法自然地出现在足够大的语言模…

【Flutter】Flutter 如何使用 flutter_swiper

文章目录 一、前言二、flutter_swiper 的概念三、Flutter 中的 flutter_swiper1. 使用的库2. 方法介绍 四、代码示例1. 简单示例2. 完整示例 五、总结 一、前言 在移动应用开发中,轮播图是一种常见的 UI 元素,它可以用来展示一系列的图片或者内容。在 F…

Baumer工业相机堡盟工业相机如何通过BGAPISDK设置多帧采集模式(C++)

Baumer工业相机堡盟工业相机如何通过BGAPISDK设置多帧采集模式(C) Baumer工业相机Baumer工业相机BGAPISDK和多帧采集模式的技术背景Baumer工业相机通过BGAPISDK设置多帧采集模式功能1.引用合适的类文件2.通过BGAPISDK设置多帧采集模式功能 Baumer工业相机…

Servlet (上篇)

哥几个来学 Servlet 啦 ~~ 目录 🌲一、什么是 Servlet 🌳二、第一个 Servlet 程序 🍇1. 创建项目 🍈2. 引入依赖 🍉3. 创建目录 🍊4. 编写代码 🍋5. 打包程序 🥭6. 部署程序…

【力扣刷题 | 第十五天】

目录 前言: ​​​​​​​63. 不同路径 II - 力扣(LeetCode) 343. 整数拆分 - 力扣(LeetCode) 总结: 前言: 本篇我们主要刷动态规划的题,解题还是严格按照我们在【夜深人静写算法…

macOS Sonoma 14 beta 2 (23A5276g) Boot ISO 原版可引导镜像

macOS Sonoma 14 beta 2 (23A5276g) Boot ISO 原版可引导镜像 本站下载的 macOS 软件包,既可以拖拽到 Applications(应用程序)下直接安装,也可以制作启动 U 盘安装,或者在虚拟机中启动安装。另外也支持在 Windows 和 …

第4章 流程控制

第4章 流程控制 if else常规用法 单分支&#xff0c;双分支&#xff0c;多分支 带返回值 ​ scala实现java三元运算符 ​ for循环控制 基本语法 for ( 循环变量 <- 数据集 ) { 循环体} package chapter04import scala.language.postfixOpsobject Test02_ForLoop {def ma…

java的嵌套类(nested class)、内部类(inner class)的区别

嵌套类即nested class&#xff0c;内部类即Inner class。 概括来说&#xff0c;嵌套类的概念比内部类概念大。嵌套类包含内部类和非内部类。一个内部类一定是一个嵌套类&#xff0c;但一个嵌套类不一定是一个内部类。 在一个类内部或者接口内部声明的类是嵌套类。 下面这些类是…

php个人简历模板

php个人简历模板一 目前所在&#xff1a; 广州 年 龄&#xff1a; 31 户口所在&#xff1a; 汕头 国 籍&#xff1a; 中国 婚姻状况&#xff1a; 已婚 民 族&#xff1a; 汉族 身 高&#xff1a; 175 cm 体 重&#xff1a; 求职意向 人才类型&#xff1a; 普通求职 应聘职…

React封装axios请求

1、前言 因为最近在进行老系统用新框架改造&#xff0c;正好用到了react&#xff0c;就顺便整理了一下react中对axios进行封装的相关知识点和步骤。 2、如何封装 可以参考一下chat gpt给出的回答。 我大概总结一下&#xff0c;其实就是使用axios.create创建一个axios的实例&…

如何清除浏览器的 DNS 缓存 (Chrome, Firefox, Safari)

如何清除浏览器的 DNS 缓存 (Chrome, Firefox, Safari) Chrome Chromium Edge Firefox Safari clear DNS Cache, flush DNS cache 请访问原文链接&#xff1a;https://sysin.org/blog/clear-browser-dns-cache/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。…

设计模型学习-UML图

1&#xff0c;简介 UML图有很多种类型&#xff0c;但掌握其中的类图、用例图和时序图就可以完成大部分的工作。其中最重要的便是「类图」&#xff0c;它是面向对象建模中最常用和最重要的图&#xff0c;是定义其他图的基础。 类图主要是用来显示系统中的类、接口以及它们之间的…

Qt/C++编写手机版本视频播放器和Onvif工具(可云台和录像)

一、前言 用Qtffmpeg写播放器很多人有疑问&#xff0c;为何不用Qt自己的多媒体框架来写&#xff0c;最重要的原因是Qt自带的目前都依赖具体的本地解码器&#xff0c;如果解码器不支持&#xff0c;那就是歇菜的&#xff0c;最多支持个MP4格式&#xff0c;而且在手机上也都是支持…

音视频数据处理-H265/HEVC视频码流分析

一、H265概述 H265/HEVC&#xff08;Hight Efficiency Video Coding&#xff09;是由ITU-T和ISO/IEC两大组织在H264/AVC的基础之上推出的新一代高效视频编码标准&#xff0c;主要为应对高清和超高清视频在网络传输和数据存储方面带来的挑战。上一篇文章对H264/AVC视频码流进行…

python复习第一章

什么是 Python&#xff1f; Python 是一门流行的编程语言。它由 Guido van Rossum 创建&#xff0c;于 1991 年发布。 它用于&#xff1a; Web 开发&#xff08;服务器端&#xff09;软件开发数学系统脚本 Python 可以做什么&#xff1f; 可以在服务器上使用 Python 来创建…