学会promise和async/await的巧用小妙招

2024-02-01 21:36

本文主要是介绍学会promise和async/await的巧用小妙招,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

因为JavaScript是一种单线程的语言,无法同时执行多个任务。为了解决这个问题,JavaScript引入了Promise和async/await两种方式来处理异步操作。

Promise是一种用于处理异步操作的对象,它可以将异步操作包装成一个对象,通过链式调用的方式来处理异步操作的结果。Promise对象有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。当异步操作执行完成后,Promise对象的状态会从pending变为fulfilled或rejected,并且会调用相应的回调函数。

而async/await是ES2017引入的一种用于处理异步操作的语法糖,它是基于Promise的一种更加简洁和可读性更高的异步编程模式。,它基于Promise实现,使得异步代码的编写更加简洁和易读。async函数是一个返回Promise对象的函数,通过在函数前面加上关键字async来声明。在async函数中,可以使用await关键字来等待一个Promise对象的结果,然后将结果赋值给一个变量。

一、Promise

Promise是一种用于处理异步操作的对象。它有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。一个Promise对象可以通过调用resolve方法来转为fulfilled状态,或者通过调用reject方法来转为rejected状态。当一个Promise对象的状态变为fulfilled或rejected时,会触发相应的回调函数。Promise 是 ES6 中引入的一种处理异步操作的方式,它通过 then 和 catch 方法来处理异步操作的结果和错误。

Promise的基本用法如下:

const promise = new Promise((resolve, reject) => {// 异步操作if (异步操作成功) {resolve(结果);} else {reject(错误);}
});promise.then((结果) => {// 处理成功的结果
}).catch((错误) => {// 处理失败的错误
});

Promise 的构造函数接受一个执行器函数作为参数,该执行器函数接受两个参数 resolve 和 reject,分别用于处理异步操作的结果和错误。Promise的优点是可以避免回调地狱(callback hell),即多层嵌套的回调函数。但是在处理多个异步操作时,Promise的链式调用会导致代码冗长且难以维护。这时可以使用async/await来简化代码。

二、async/await

async/await是基于Promise的一种更加简洁和可读性更高的异步编程模式。async函数是返回一个Promise对象的函数,而await关键字用于等待一个Promise对象的结果。

在使用async/await时,我们可以使用try/catch语句来捕获和处理异步操作中的错误。try/catch可以用于捕获await表达式中的错误,以及async函数内部的同步错误。如果在async函数内部没有使用try/catch来捕获错误,错误会被自动地传递给async函数返回的Promise对象的拒绝处理函数。

async函数的基本用法如下:

async function 函数名(参数) {// 异步操作if (异步操作成功) {return 结果;} else {throw 错误;}
}函数名(参数).then((结果) => {// 处理成功的结果
}).catch((错误) => {// 处理失败的错误
});

在async函数中,可以使用await关键字来等待一个Promise对象的结果。await关键字只能在async函数中使用,它会暂停async函数的执行,直到Promise对象的状态变为fulfilled或rejected。

await关键字的基本用法如下:

const 结果 = await Promise对象;

await关键字只能在async函数内部使用,它用于等待一个Promise对象的解析结果。当遇到await关键字时,async函数会暂停执行,直到Promise对象被解析完成并返回结果。

注意,await关键字只能在async函数中使用。如果在非async函数中使用await关键字,会导致语法错误。

async/await的优点是可以使用同步的方式编写异步代码,使得代码更加简洁和易于理解。它可以避免回调地狱,同时也可以处理多个异步操作的并发执行。

三、async/await和Promise的区别

async/await和Promise都是用于处理异步操作的方式,它们之间有以下几点区别:

  1. 语法差异:async/await使用async函数和await关键字来处理异步操作,而Promise使用Promise对象的then和catch方法来处理异步操作。

  2. 错误处理:在async/await中,可以使用try/catch语句来捕获异步操作的错误。而在Promise中,可以使用catch方法来捕获异步操作的错误。

  3. 可读性:使用Promise时,由于需要通过链式调用的方式来处理异步操作的结果,代码会变得比较冗长,可读性较差。而使用async/await时,可以通过在async函数中使用await关键字来等待异步操作的结果,代码更加简洁和易读。async/await相对于Promise来说,代码更加简洁和易于理解。它使用同步的方式编写异步代码,避免了回调地狱。

  4. 并发执行:Promise可以使用Promise.all方法来并发执行多个异步操作,而async/await需要使用Promise的语法来实现。

  5. 使用场景:Promise适用于处理多个异步操作的情况,可以通过链式调用的方式来处理异步操作的结果。而async/await适用于处理单个异步操作的情况,通过在async函数中使用await关键字来等待异步操作的结果。

四、实例演示

  1. 使用Promise实现异步操作
function delay(ms) {return new Promise((resolve) => {setTimeout(resolve, ms);});
}delay(1000).then(() => {console.log('1秒后执行');
});
  1. 使用async/await实现异步操作
async function delay(ms) {await new Promise((resolve) => {setTimeout(resolve, ms);});
}async function run() {await delay(1000);console.log('1秒后执行');
}run();
  1. 并发执行多个异步操作

使用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]
});

使用async/await实现:

async function run() {const promise1 = Promise.resolve(1);const promise2 = Promise.resolve(2);const promise3 = Promise.resolve(3);const results = await Promise.all([promise1, promise2, promise3]);console.log(results); // [1, 2, 3]
}run();

五、总结

async/await 和 Promise 是 JavaScript 中处理异步操作的两种方式。async/await 是基于 Promise 的语法糖,它可以更方便地编写异步代码。在使用 async/await 时,可以使用 try/catch 语句来处理异步操作的错误。在使用 Promise 时,可以使用 then 和 catch 方法来处理异步操作的结果和错误。

async/await是基于Promise的一种更加简洁和可读性更高的异步编程模式,可以避免回调地狱,使得代码更加简洁和易于理解。

如果只需要处理一个异步操作,可以使用Promise;如果需要处理多个异步操作,可以使用async/await和Promise的组合来实现并发执行。

这篇关于学会promise和async/await的巧用小妙招的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/668533

相关文章

一文详解Java Condition的await和signal等待通知机制

《一文详解JavaCondition的await和signal等待通知机制》这篇文章主要为大家详细介绍了JavaCondition的await和signal等待通知机制的相关知识,文中的示例代码讲... 目录1. Condition的核心方法2. 使用场景与优势3. 使用流程与规范基本模板生产者-消费者示例

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论

为何我建议你学会抄代码?

文章目录 为何我建议你学会抄代码?一、引言二、抄代码的艺术1、理解抄代码的真正含义1.1、抄代码的好处 2、如何有效地抄代码2.1、发现问题2.2、整理需求2.3、造轮子标准流程 三、抄代码的实践案例1、发现问题2、整理需求3、设计重试机制4、实现重试工具类5、使用重试工具类6、优化和扩展 四、总结 为何我建议你学会抄代码? 一、引言 在编程的世界中,“抄代码” 常被视为一

【JavaScript】异步操作:Promise对象

文章目录 1 概述2 Promise 对象的状态3 Promise 构造函数4 Promise.prototype.then()5 then() 用法辨析6 微任务 1 概述 Promise 对象是 JavaScript 的异步操作解决方案,为异步操作提供统一接口。它起到代理作用,充当异步操作与回调函数之间的中介,使得异步操作具备同步操作的接口。 Promise 的设计思想是,

【JavaScript】defer和async的区别

转载自:https://segmentfault.com/q/1010000000640869 先来试个一句话解释仨,当浏览器碰到 script 脚本的时候: <script src="script.js"></script> 没有 defer 或 async,浏览器会立即加载并执行指定的脚本,“立即”指的是在渲染该 script 标签之下的文档元素之前,也就是说不等待后续载入的文档元素,读

上海市计算机学会竞赛平台2024年7月月赛丙组求和问题

题目描述 给定 nn 个整数 a1,a2,…,ana1​,a2​,…,an​,请问这个序列最长有多少长的前缀,满足元素的和大于或等于 00?如果任何长度大于 00 的前缀之和都为负数,则输出 00 输入格式 第一行:单个整数表示 nn第二行:nn 个整数表示 a1,a2,…,ana1​,a2​,…,an​ 输出格式 单个整数:表示最长的前缀长度,使得前缀的和大于等于 00 数据范围

上海市计算机学会竞赛平台2024年8月月赛丙组等差数列的素性

题目描述 给定三个整数 nn,aa 与 dd,表示一个项数为 nn 的等差数列,首项为 aa,公差为 dd。 请统计,从这个等差数列中有多少数字是素数 输入格式 三个整数: nn,aa 与 dd 输出格式 单个整数:表示素数数量 数据范围 50%50% 的数据,1≤n≤10001≤n≤1000100%100% 的数据,1≤n≤100001≤n≤100001≤d≤10001≤d≤10

【数据结构】你真的学会了二叉树了吗,来做一做二叉树的算法题及选择题

文章目录 1. 二叉树算法题1.1 单值二叉树1.2 相同的树1.3 另一棵树的子树1.4 二叉树的遍历1.5 二叉树的构建及遍历 2. 二叉树选择题3. 结语 1. 二叉树算法题 1.1 单值二叉树 https://leetcode.cn/problems/univalued-binary-tree/description/ 1.2 相同的树 https://leet

Promise的使用总结

Promise 是 JavaScript 中用于处理异步操作的一种机制。它提供了一种更清晰和更简洁的方式来处理异步代码,避免了回调地狱。以下是 Promise 的使用方法,包括创建 Promise、链式调用、错误处理、并行执行等。 1. 创建 Promise 你可以使用 new Promise 来创建一个新的 Promise 对象。Promise 构造函数接受一个执行函数,该函数有两个参数:r

async-http-android框架的介绍和二次封装

1。先谈谈框架吧 相信大家一看,就应该想到是一款异步请求的框架了,也就是说他的网络请求是在非UI线程中执行的,而callback在创建他的线程中,应用了Handler的机制。 项目本生的官方网址:http://loopj.com/android-async-http/, 对应的github地址: https://github.com/loopj/android-async-http