(异步编程)前端八股文修炼Day3

news2024/11/13 9:08:10

在这里插入图片描述

一异步编程异步编程的实现方式?

在 JavaScript 中,异步编程是处理异步操作的重要部分,常见的异步编程实现方式有以下几种:

  1. 回调函数(Callbacks):回调函数是最基本的异步编程方式,通过在异步操作完成后调用回调函数来处理结果。例如:
function fetchData(callback) {
    setTimeout(() => {
        const data = 'Some data';
        callback(data);
    }, 1000);
}

fetchData((data) => {
    console.log(data);
});
  1. Promise:Promise 是 ES6 引入的用于处理异步操作的对象,可以更清晰地处理异步操作成功或失败的情况。例如:
function fetchData() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            const data = 'Some data';
            resolve(data);
        }, 1000);
    });
}

fetchData().then((data) => {
    console.log(data);
}).catch((error) => {
    console.error(error);
});
  1. Async/Await:Async/Await 是建立在 Promise 基础上的异步编程方式,使用 async 声明异步函数,await 用于等待 Promise 对象的解决。例如:
async function fetchData() {
    return new Promise((resolve) => {
        setTimeout(() => {
            const data = 'Some data';
            resolve(data);
        }, 1000);
    });
}

async function processData() {
    const data = await fetchData();
    console.log(data);
}

processData();
  1. 事件监听(Event Emitter):通过事件监听器来处理异步操作的完成或状态改变。Node.js 中的 Event Emitter 模块是一个很好的例子。

  2. Generator:使用 Generator 函数可以实现手动控制异步操作的流程。通过 yield 关键字暂停和恢复函数的执行,可以在需要时执行异步操作。
    JavaScript 中的异步函数具有以下特点:

优点:

  1. 提高性能:异步函数可以在等待某些操作完成时继续执行其他任务,提高程序的性能和响应速度。
  2. 避免阻塞:避免了因为单个任务的阻塞而导致整个程序停顿的情况,保持程序的流畅性。
  3. 更好的用户体验:在 Web 开发中,异步函数常用于处理网络请求和用户交互,使用户体验更加流畅。

缺点:

  1. 复杂度增加:异步编程可能引入回调地狱,使代码难以理解和维护。
  2. 错误处理困难:异步函数的错误处理可能比同步代码复杂,需要额外注意错误传播和处理。

使用场景:

  1. 网络请求:通过异步函数处理网络请求,避免阻塞页面。
  2. 定时任务:处理定时执行的任务,如定时更新数据、定时轮询等。
  3. 事件处理:处理用户交互事件,如点击、滚动等。
  4. 文件操作:读取文件、写入文件等 I/O 操作。
  5. 动画效果:实现动态效果,如渐变、移动等。

在实际开发中,合理利用异步函数可以提升程序的性能和用户体验,但也需要注意处理好异步操作带来的复杂性和错误处理。

二 回调函数

  • 回调函数
    是一种常见的编程概念,在 JavaScript 中尤其常见。简单来说,回调函数是作为参数传递给其他函数的函数。当特定的事件发生或条件满足时,这个函数会被调用执行。回调函数使得我们可以在某个操作完成后执行特定的代码逻辑,通常用于处理异步操作、事件处理和处理数据。

在 JavaScript 中,回调函数通常作为另一个函数的参数传入,然后在合适的时机被调用。例如,考虑下面的示例:

function fetchData(callback) {
    // 模拟异步操作
    setTimeout(() => {
        const data = 'Some data';
        callback(data); // 在异步操作完成后调用回调函数并传入数据
    }, 1000);
}

function processReceivedData(data) {
    console.log('Processing data:', data);
}

// 调用 fetchData 函数,并将 processReceivedData 函数作为回调函数传入
fetchData(processReceivedData);

在上面的示例中,fetchData 函数模拟了一个异步操作,当操作完成后会调用传入的回调函数 callbackprocessReceivedData 函数就是回调函数,在数据准备好后会被调用来处理接收到的数据。

回调函数是一种强大的编程技术,可以使代码更具灵活性和可扩展性。然而,回调地狱(Callback Hell)是一个常见的问题,即多重嵌套的回调函数使得代码难以理解和维护。为了解决这个问题,后续出现了 Promise、Async/Await 等更高级的异步处理方式。

  • 回调地狱
    是指多重嵌套的回调函数导致代码变得混乱和难以维护的情况。下面我将演示一个简单的回调地狱示例,展示多个异步操作嵌套的情况:
// 模拟异步操作1
function asyncOperation1(callback) {
    setTimeout(() => {
        console.log('Async Operation 1 completed');
        callback();
    }, 1000);
}

// 模拟异步操作2
function asyncOperation2(callback) {
    setTimeout(() => {
        console.log('Async Operation 2 completed');
        callback();
    }, 1000);
}

// 模拟异步操作3
function asyncOperation3(callback) {
    setTimeout(() => {
        console.log('Async Operation 3 completed');
        callback();
    }, 1000);
}

// 嵌套的回调函数
asyncOperation1(function() {
    asyncOperation2(function() {
        asyncOperation3(function() {
            console.log('All async operations completed');
        });
    });
});

在上面的示例中,asyncOperation1asyncOperation2asyncOperation3 分别模拟了三个异步操作,每个操作完成后调用传入的回调函数。然后,在主代码中,这三个异步操作被嵌套调用,形成了回调地狱的情况。

随着异步操作的复杂度增加,回调地狱会导致代码的可读性变差,难以维护和调试。为了解决回调地狱问题,可以使用 Promise、Async/Await 等方式来改善异步操作的处理,使代码更清晰、易读和易维护。

希望这个示例能够帮助你理解回调地狱的概念。如果有任何问题或需要进一步解释,请随时告诉我!

三 Promise的理解

Promise 是 JavaScript 中用于处理异步操作的一种解决方案,它解决了回调地狱(Callback Hell)问题,提供了更优雅和可靠的方式来处理异步操作。下面是 Promise 的基本理解和用法:

Promise 的基本理解:
  1. 状态:Promise 对象有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败)。
  2. 特点:一旦状态变为 fulfilled 或 rejected,就会保持这个状态,不再改变。
  3. 方法:Promise 对象有两个重要的方法,分别是 then()catch(),用于处理成功和失败的情况。
Promise 解决的问题:
  1. 回调地狱问题:传统的回调函数嵌套容易导致代码难以维护和理解,而 Promise 可以解决这个问题,使代码结构更清晰。
  2. 异步操作的状态处理:Promise 提供了更好的方式来处理异步操作的成功和失败状态,使代码更可靠和健壮。
Promise 的基本用法:
  1. 创建 Promise 对象:使用 new Promise() 构造函数,传入一个执行器函数,这个函数接收两个参数 resolvereject
const myPromise = new Promise((resolve, reject) => {
    // 异步操作成功时调用 resolve,失败时调用 reject
    if (/* 异步操作成功 */) {
        resolve('Success');
    } else {
        reject('Error');
    }
});
  1. 处理 Promise 对象:使用 then() 方法处理成功状态,使用 catch() 方法处理失败状态。
myPromise.then((result) => {
    console.log(result); // 打印成功信息
}).catch((error) => {
    console.error(error); // 打印错误信息
});
  1. Promise 链式调用:可以通过链式调用多个 Promise,每个 then() 都返回一个新的 Promise 对象。
myPromise.then((result) => {
    return someOtherAsyncOperation(result);
}).then((anotherResult) => {
    console.log(anotherResult);
}).catch((error) => {
    console.error(error);
});
Promise.allPromise.race

是 JavaScript 中用于处理多个 Promise 对象的方法,它们有不同的用途:

  1. Promise.all

    • 特点Promise.all 接收一个包含多个 Promise 对象的可迭代对象(如数组),并返回一个新的 Promise 对象。该新 Promise 对象在所有输入的 Promise 对象都成功解决(resolve)时才会被解决,如果任何一个 Promise 被拒绝(reject),则整个 Promise.all 就会被拒绝。
    • 使用场景:当需要等待多个异步操作都完成后再执行后续操作时,使用 Promise.all 是非常有用的。比如同时请求多个接口数据,等待它们都返回后再进行数据处理。
  2. Promise.race

    • 特点Promise.race 接收一个包含多个 Promise 对象的可迭代对象,返回一个新的 Promise 对象。该新 Promise 对象会在第一个 Promise 对象解决或拒绝时解决或拒绝,无论其他 Promise 对象的状态如何。
    • 使用场景:当只需要获取最快解决的 Promise 结果时,可以使用 Promise.race。例如,设置一个超时机制,获取多个请求中最快返回的结果。

因此,Promise.all 适用于需要等待所有 Promise 完成的场景,而 Promise.race 则适用于需要快速获取第一个完成的 Promise 结果的场景。

通过 Promise,我们可以更好地处理异步操作,避免回调地狱,提高代码的可读性和可维护性。

四 async/await

在理解 async/await 的工作原理时,关键点在于理解 await 关键字的作用。await 关键字用于等待一个 Promise 对象的状态变为 resolved(成功)或 rejected(失败),然后返回 Promise 的解决值(resolved value)。

当在一个 async 函数中使用 await 关键字时,它会暂停函数的执行,直到 await 后面的 Promise 对象状态改变。换句话说,await 实际上是在等待一个异步操作的完成,而不是阻塞整个线程。在等待期间,JavaScript 引擎可以去执行其他任务,从而避免了阻塞。

具体来说,当遇到 await 关键字时,JavaScript 引擎会做以下工作:

  1. 如果 await 后面的表达式是一个 Promise,它会暂停函数的执行,并等待该 Promise 对象的状态改变。
  2. 如果 Promise 对象变为 resolved(成功),await 表达式的结果将是 Promise 的 resolved value,函数会继续执行。
  3. 如果 Promise 对象变为 rejected(失败),await 将抛出一个 rejected Promise,可以使用 try/catch 块来捕获异常。

因此,await 实际上是让程序等待一个异步操作的完成,使得代码看起来更像同步代码的写法,同时保持了异步操作的非阻塞特性。

async/await 如何捕获异常

async/await 中捕获异常可以通过使用 try/catch 块来实现,这样可以更方便地处理异步操作中的错误。下面是一个简单的示例代码,展示了如何在 async/await 中捕获异常:

async function fetchData() {
    try {
        const result = await fetch('https://api.example.com/data');
        const data = await result.json();
        console.log(data);
    } catch (error) {
        console.error('An error occurred:', error);
    }
}

在上面的示例中,try 块用于包裹可能出现异常的异步操作,catch 块用于处理捕获到的异常。

在 JavaScript 中,由于主要是单线程执行,通常并发操作是通过异步机制实现的,而并行操作则需要借助 Web Workers 等技术来实现。在处理多个异步任务时,可以通过 Promise.all 实现并发地执行多个异步操作,或者使用 Promise.race 来获取最快完成的结果。但需要注意,并发执行并不意味着真正的并行执行,仍受单线程限制。

希望以上解释能帮助你理解如何在 async/await 中捕获异常,并区分并发与并行的概念。如有任何疑问或需要进一步解释,请随时告诉我!

五 async/await的优势async/await对比Promise的优势

async/awaitPromise 都是用于处理异步操作的工具,它们各自有不同的优势和适用场景:

async/await 的优势:

  1. 更直观的代码结构async/await 让异步代码看起来更像同步代码,提高了代码的可读性和可维护性。
  2. 更方便的错误处理:使用 try/catch 结构可以更轻松地捕获和处理异步操作中的错误。
  3. 更容易的控制流程:可以像编写同步代码一样编写异步代码,使得流程控制更加直观和容易理解。
  4. 支持异步操作的串行执行:使用 async/await 可以便捷地实现多个异步操作按顺序执行(串行执行)的需求。

Promise 的优势:

  1. 更灵活:Promise 提供了更多的方法(如 Promise.all, Promise.race)来处理多个异步操作的情况。
  2. 更适合并行操作:Promise 更适合处理多个异步操作并行执行的情况,特别是需要同时处理多个请求的场景。
  3. 更具通用性:Promise 是一种更底层的异步处理机制,可以与其他异步操作兼容,适用于更多类型的异步操作。

综上所述,async/await 适用于简化异步代码、提高可读性和错误处理的情况,尤其适合处理需要按顺序执行的异步操作;而 Promise 则更适合处理需要并行执行多个异步操作的场景,具有更灵活和通用的特点。

六 setTimeout、Promise、Async/Await 的区别?

setTimeoutPromiseAsync/Await 是 JavaScript 中常用的处理异步操作的方式,它们有不同的特点和用途,下面我将简要介绍它们的区别:

  1. setTimeout

    • setTimeout 是一个用于设置定时器的函数,可以在一定时间后执行指定的回调函数。
    • 它是一种简单的异步操作方式,常用于在一段时间后执行某个操作。
    • setTimeout 并不会处理异步操作的状态,无法处理异步操作的成功或失败。
  2. Promise

    • Promise 是一种表示异步操作最终完成或失败的对象,可以更好地处理异步操作的成功和失败状态。
    • Promise 对象有三种状态:pending(进行中)、fulfilled(已成功)和 rejected(已失败),可以通过 then() 方法处理成功状态和 catch() 方法处理失败状态。
    • Promise 可以解决回调地狱(callback hell)问题,使代码更易读和维护。
  3. Async/Await

    • Async/Await 是建立在 Promise 基础上的异步操作方式,使用 asyncawait 关键字来编写异步代码。
    • async 声明的函数返回一个 Promise 对象,可以使用 await 暂停异步操作并等待 Promise 对象的解决。
    • Async/Await 让异步代码看起来更像同步代码,更易于理解和维护,同时保留了 Promise 的优势。

总结

  • setTimeout 是简单的定时器函数,不处理异步操作状态。
  • Promise 是一种表示异步操作状态的对象,可以更好地处理异步操作成功或失败的情况。
  • Async/Await 是建立在 Promise 基础上的语法糖,让异步代码更易读、易维护。

根据不同的需求和场景选择适合的方式来处理异步操作,可以提高代码的可读性和可维护性。希望这个回答能帮助你理解它们之间的区别。如果有任何疑问或需要进一步解释,请随时告诉我!

七 setTimeout、setInterval、requestAnimationFrame 各有什么特点

setTimeoutsetIntervalrequestAnimationFrame 是 JavaScript 中常用的定时器函数,它们各有不同的特点和用途:

  1. setTimeout

    • setTimeout 函数用于在一定时间后执行一次指定的函数。
    • 特点:可以设置延迟时间,单位为毫秒,只执行一次指定的函数。
    • 用途:适合需要延迟执行一次的操作,如延迟加载资源、设置定时器等。
  2. setInterval

    • setInterval 函数用于每隔一定时间重复执行指定的函数。
    • 特点:可以设置重复执行的时间间隔,单位为毫秒,会重复执行指定的函数。
    • 用途:适合需要定时执行重复操作的场景,如动画效果、定时更新数据等。
  3. requestAnimationFrame

    • requestAnimationFrame 是浏览器提供的 API,用于在浏览器下一次重绘之前执行指定的函数,通常用于实现动画效果。
    • 特点:会根据浏览器的刷新频率进行调用,更加节省资源并能够实现更流畅的动画效果。
    • 用途:主要用于实现动画效果,避免出现闪烁或卡顿。

在实际使用中,应根据具体需求选择合适的定时器函数。如果需要简单的延迟执行或重复执行操作,可以使用 setTimeoutsetInterval;如果需要实现流畅的动画效果,推荐使用 requestAnimationFrame

希望这能帮助你理解 setTimeoutsetIntervalrequestAnimationFrame 的特点和用途。如有任何疑问或需要进一步解释,请随时告诉我!

八 并发与并行的区别

关于并发与并行的区别:

  • 并发(Concurrency):指同时处理多个任务,但不一定是同时执行。在 JavaScript 中,异步操作通过事件循环机制实现并发,可以看作是在一个线程中交替执行多个任务。
  • 并行(Parallelism):指同时执行多个任务,通常需要多个线程或进程。在 JavaScript 中,Web Workers 可以用于实现并行操作,但主线程仍是单线程的。

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

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

相关文章

【第三方登录】Google邮箱

登录谷歌邮箱开发者 https://console.developers.google.com/ 先创建项目 我们用的web应用 设置回调 核心主要: 1.创建应用 2.创建客户端ID 3.设置域名和重定向URL 4.对外公开,这样所有的gmail邮箱 都能参与测试PHP代码实现 引入第三方包 h…

智慧园区楼宇AI解决方案

背景 人工智能对于人类的影响要比工业革命发生的速度快10倍,规模大 300倍,影响几乎大3000倍 - 麦肯锡全球研究院;2017年7月20日,国务院印发《新一代人工智能发展规划》,首次把人工智能发展上升为国家战略层面,全面布局面向2030年的中国人工智能发展整体规划;中美同时进…

解密Google Cloud 全新 PaLM2及创新应用

📸背景 因长期在大模型相关的部门工作,每天接收到很多和AI相关的信息,但小编意识到目前理解到的一些AI知识还有些片面。 恰逢稀土掘金开发者大会有谈到大模型相关的知识,于是借此机会,对大模型相关的一些知识再了解一…

GuLi商城-商品服务-API-三级分类-查询-树形展示三级分类数据

1、网关服务配置路由 2、商品服务 3、启动本地nacos&#xff0c;打开nacos地址看nacos服务列表 4、编写VUE <template> <el-tree :data"menus" :props"defaultProps" node-click"handleNodeClick"></el-tree> </template…

【自我提升】计算机领域相关证书

目录 计算机技术与软件专业资格&#xff08;水平&#xff09;考试证书&#xff08;软考&#xff09;Oracle认证Cisco认证微软认证红帽认证AWS认证 计算机技术与软件专业资格&#xff08;水平&#xff09;考试证书&#xff08;软考&#xff09; 计算机技术与软件专业技术资格&a…

做自配送平台,商家如何发单?平台可以接收那些订单?

为了增加品牌曝光&#xff0c;许多商家选择加入外卖平台&#xff0c;然而随着时间推移&#xff0c;一些问题也逐渐显现&#xff1a;大平台对商家的配送抽佣越来越高&#xff0c;很多商家都选择自配送来降本增效。 但是问题来了&#xff01;目前市面上没有一款产品是自动发单到…

栈应用之---括号匹配

题意描述&#xff1a; 在算术表达式中&#xff0c;除了加、减、乘、除等运算外&#xff0c;往往还有括号。包括有大括号{}&#xff0c;中括号[]&#xff0c;小括号()&#xff0c;尖括号<>等。 对于每一对括号&#xff0c;必须先左边括号&#xff0c;然后右边括号&#xf…

【Excel表格中如何将单元格数据复制粘贴到合并后的单元格中】

要实现的效果如下&#xff1a; 方法一、使用插件 1、下载“方方格子”插件 下载地址&#xff1a;http://www.ffcell.com/home/ffcell.aspx 2、下载完成后&#xff0c;启动WPS或Excel软件&#xff0c;同意添加插件&#xff0c;选择【方方格子】-【复制粘贴】-【复制到合并区域…

现代化应用部署工具-Docker

Docker 简介 什么是Docker Docker 是一个开源的应用容器引擎&#xff0c;可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上。 Docker部署的优势 通过使用Docker等容器技术&#xff0c;可以将应用程序及其依赖项…

安卓转鸿蒙竟如此丝滑

随着鸿蒙的爆火&#xff0c;大家都想知道鸿蒙能不能搞&#xff1f; 相信大家搞开发的&#xff0c;都多多少少的了解过鸿蒙。近几个月鸿蒙的大动作也不少&#xff0c;如&#xff1a;重庆市近20个垂域应用与鸿蒙原生合作、深圳制定鸿蒙《行动计划》、阿里再次与鸿蒙展开合作&…

学习次模函数-第1章 引言

许多组合优化问题可以被转换为集合函数的最小化&#xff0c;集合函数是在给定基集合的子集的集合上定义的函数。同样地&#xff0c;它们可以被定义为超立方体的顶点上的函数&#xff0c;即&#xff0c;其中是基集合的基数-它们通常被称为伪布尔函数[27]。在这些集合函数中&…

“大变局开启”!比特币出现“资金出逃”!以太币ETF获批“乌云重重”!

比特币(BTC)在周(24)日最低来到63772美元之后&#xff0c;就持续震荡上涨。今(25)晨七点左右最高更逼近67628美元。以太坊(ETH)走势与BTC接近&#xff0c;清晨最高触及3471美元之后有所回调。 对于比特币的疲惫走势&#xff0c;业内人士指出&#xff0c;近期比特币价格创下新高…

OSCP靶场--Cockpit--待续

OSCP靶场–Cockpit 考点(sql注入绕过sudo tar提权) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.229.10 -Pn -sV -sC --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-25 01:40 EDT Nmap scan report for 192.168.…

向上生长

&#xff08;1&#xff09; 我记得2010年&#xff0c;在中国的苹果应用商店里&#xff0c;充斥的App还有很多&#xff1a;日历App、天气App、电池省电App、记事本App…。但这已经过去了2007-2008-2009三年&#xff0c;这些应用仍然很欢。 我有一个朋友算是中国最早一批开发iOS …

promethus的安装使用

1、# 软件下载地址 https://prometheus.io/download/ https://grafana.com/grafana/download https://prometheus.io/download/ Prometheus是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的。 Prometheus 的优点 1、非常少的外部依赖,安装…

普通员工如何快速成为领导 管理与领导的区别 你有想过你缺哪?

一切为了生存。 我的总结&#xff08;我居然从来没想过&#xff09; 1、领袖&#xff1a;领人导事。规划能力&#xff0c;画饼&#xff0c;对结果赏罚。用人&#xff0c;什么人能放心干成。 2、管理&#xff1a;管人理事。对人清楚&#xff0c;对事清楚。 3、通用能力&#x…

今日大模型论文 || 清华微软联合打造LLMLingua2,速度提升达2.9倍

引言&#xff1a;探索任务无关的提示压缩技术 在大型语言模型&#xff08;LLMs&#xff09;的应用中&#xff0c;提示&#xff08;prompts&#xff09;的使用已成为一种常见的技术&#xff0c;它通过丰富而信息量大的提示来处理复杂和多样化的任务。然而&#xff0c;这些提示往…

STL ④ —— 哈希

1. 散列表 根据 key 计算 key 在表中的位置的数据结构&#xff1b;是 key 和其所在存储地址的映射关系&#xff0c;即 hash(key) % size index struct node{void *key;void *value;struct node *next; };2. hash函数 2.1 hash函数的特点 计算速度快强随机分布性&#xff0…

013_Linux(上传rz,下载sz,tar,zip,unzip)

目录 一、上传、下载 1、通过鼠标操作 &#xff08;1&#xff09;下载 &#xff08;2&#xff09;上传 2、通过命令操作 rz、sz &#xff08;1&#xff09;下载 sz &#xff08;2&#xff09;上传 rz 二、压缩、解压 1、tar命令 &#xff08;1&#xff09;压缩 &…

成为创作者的第 730 天——创作纪念日

​​ 文章目录 &#x1f4e8; 官方致信&#x1f3af;我的第一篇文章&#x1f9e9; 机缘与成长 &#x1f3af; 成就&#x1f3af; 目标 &#x1f4e8; 官方致信 今天早上打开 CSDN 私信一看&#xff0c;看到了这一条消息&#xff0c;然后看了下日期。突然感慨到&#xff0c;是…