Promise 与 async 和 await 的关系

Promise、async/await 是 JavaScript 中多用来处理异步操作方法,它们之间存在关系和互相补充的特性。

Promise 是一种用于处理异步操作的对象,它可以表示一个异步操作的最终完成或失败,并可以在操作完成后获取结果或处理错误。通过 Promise,我们可以使用链式调用来处理多个异步操作,使代码更具可读性。

async/await 是基于 Promise 的一种语法糖,它提供了一种更直观和同步化的方式来编写异步代码。通过使用 async 关键字声明一个函数为异步函数,并使用 await 关键字来等待 Promise 对象的解决(即完成或拒绝),我们可以以同步的方式编写异步操作的代码。

关系:

  1. Promise 可以在其回调函数中使用 async/await 语法来进行异步操作。通过将异步操作封装在 Promise 对象中,我们可以使用 async/await 来更清晰地表达异步操作的顺序和依赖关系。
  2. async 函数始终返回一个 Promise 对象,它会自动将函数的返回值包装在一个已解决(resolved)的 Promise 中。这意味着我们可以在 async 函数中使用 await 来等待其他 Promise 的完成,并以同步的方式处理它们的结果。
    1. 如果 await 后跟的不是promise,会进行自动使用 Promise.resolve()转换,完成后将后续代码推入微队列;若后续没有代码,会将任务完成结束推到微队列
  3. 使用 async/await 可以使异步代码的编写更加简洁和可读。它可以避免嵌套的回调函数和过多的 .then() 调用,使得异步代码更接近于同步代码的写法,提高了代码的可维护性和可理解性。

示例:

async function async1() {
	console.log(1)
	await async2()
	console.log(2)
};
const async2 = async () => {
	await setTimeout(() => {
		Promise.resolve().then(() => {
			console.log(3)
		})
		console.log(4)
	},0)
}
const async3 = async () => {
	Promise.resolve().then(() => {
		console.log(6)
	})
}
async1()
console.log(7)
async3()

// 1
// 7
// 6
// 2
// 4
// 3

解释运行:

1.首选运行 async1(),先找同步代码(await 之前的代码),同步代码运行完成后,才可以取队列中的代码,输出 1;

进入async2() 运行,将 setTimeout 回调(一段时间间隔后将回调函数)推入宏队列,async2 内容完成后推入微队列;

await async2 返回的内容完成后再继续执行函数 async1, 此时async1 运行结束;

2.输出7;

3.运行async3(),promise.then() 推入微队列。

此时同步代码全部完成,队列中包括:

宏任务:计时器回调

微任务:async2 完成,6

4.清空微任务:

async2 完成,打印2 被推入微队列;

输出6;

输出2;

5.进行一个宏任务:

计时器回调运行:打印3推入微队列,输出4

6.清空微任务:输出3

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PromiseJavaScript中一种用于异步编程的工具。它可以解决回调地狱问题,让异步代码看起来更像同步代码。Promise对象有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。 async 和 awaitJavaScript 中的关键字,它们主要用于处理异步代码。async 用于声明一个函数是异步的,await 用于等待一个异步操作的结果。使用 async 和 await 可以让异步代码看起来更像同步代码,并且可以使用 try-catch 来处理错误。 ### 回答2: JavaScript中有三种异步操作方式:callback、Promiseasync/await。 1. Callback 回调函数 回调函数是最早的异步操作方法,他通常采用匿名函数的形式,在函数执行完成后将结果作为参数传入回调函数中,然后再继续执行后续操作。缺点明显,若回调函数嵌套层次过多,将造成代码阅读困难,也不容易维护。 2. Promise Promise在ES6中被引入,他提供了在异步操作完成后返回结果的能力,而且代码结构清晰,可读性好。Promise 有三种状态: * Pending(未完成) * Fulfilled(已完成) * Rejected(已失败) 如果目标任务完成,则为Fulfilled,如果任务出现错误,则为Rejected。Promise有两个关键字来控制异步操作:resolve和reject。当异步操作执行成功,就会调用resolve方法并传入需要返回的内容;当异步操作失败,就会调用reject方法并返回错误信息。一般结合then方法来使用。 3. async/await async/await 是ES7中新添加的异步方式,在ES8中被正式列入标准语言之中。async/await 基于Promise,它是一种更加优雅的语法结构,可以让异步代码看起来和同步代码风格类似。async/await 是一个相对简洁明了的解决方案,使异步操作符合同步操作的语法风格。 在 async 函数内部,可以使用await命令,就像在同步操作中等待返回结果一样。 在使用 async/await 时,必须使用try-catch包裹代码块,以捕获异常和错误信息。 async/await 并不是一种新型异步解决方案,而是一种更加方便,更加优雅的异步编程方式,使得开发人员能够更好地控制异步操作和错误处理。 总之,随着 JavaScript 的不断发展,异步编程已经成为一种必备的编程技巧。在实际编程中,理解 Promiseasync/await 和 callback 的具体用法,以及它们的优缺点是非常重要的。根据不同的场景和需求,选择最适合的异步操作方式,能够让你的代码更为优雅、简洁和可读。 ### 回答3: JavaScript 是一门异步编程语言,而 Promiseasync/awaitJavaScript 语言中的两种异步编程技术,用于解决异步编程的问题。 Promise 是一种解决 JavaScript 异步编程的技术,它是 ES6 中新增的一个对象。Promise 代表着一个异步操作的最终结果,可以是成功或失败。使用 Promise 的好处是,可以更加优雅地处理异步编程,避免了传统回调函数的回调地狱问题,使代码更容易维护和扩展。 Promise 构造函数可以接受一个函数作为参数,该函数带有 resolve 和 reject 函数作为参数。当 Promise 进入 resolved 状态时,调用 resolve 函数并返回结果;当 Promise 进入 rejected 状态时,调用 reject 函数并返回一个 error 对象,表示异步操作发生了错误。通常,使用 then 方法来处理 Promise 的结果,catch 方法来处理 Promise 的错误结果。 async/await 是 ES8 中新增的异步编程技术,它也是使用 Promise 的基础之上开发的技术。async/await 的优势在于,可以以同步代码的方式编写异步代码,使代码更加易读易写。 在使用 async/await 时,async 关键字用来修饰函数,表示该函数是一个异步函数,await 关键字用来等待 Promise 返回的结果。当在异步函数中使用 await 关键字时,代码会暂停执行,等待 Promise 返回结果,然后继续执行异步函数中的其他代码。如果 Promise 返回结果成功,使用 return 关键字返回结果;如果 Promise 失败,则使用 throw 关键字抛出异常。 总的来说,Promiseasync/await 都是解决 JavaScript 异步编程的好技术,Promise 更加实用,可以避免回调地狱问题,而 async/await 则可以让异步代码更加易读易写。在开发中,可以根据实际需求选择适合的技术来处理异步操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值