异步编程中的Promise

一、什么是Promise?我们用Promise来解决什么问题?

Promise 是异步编程的一种解决方案:从语法上讲,promise是一个对象,从它可以获取异步操作的消息;从本意上讲,它是承诺,承诺它过一段时间会给你一个结果。它允许你为异步操作的成功和失败分别指定处理函数,从而使得异步代码看起来更像是同步代码,极大地提高了代码的可读性和可维护性。Promise的状态一旦从Pending变为Fulfilled或Rejected,就不可再改变,即Promise的状态是单向流动的。

传统的回调函数虽然能解决网络请求、文件读取、定时任务等问题,但随之而来的“回调地狱”(Callback Hell)却让代码变得难以维护和理解。为了解决这个问题,ES6引入了Promise对象,为我们提供了一种更加优雅和清晰的方式来处理异步操作。

相信大家经常写这样的代码:

一般来说我们会碰到的回调嵌套都不会很多,一般就一到两级,但是某些情况下,回调嵌套很多时,代码就会非常繁琐,会给我们的编程带来很多的麻烦,这种情况俗称——回调地狱。

promise是用来解决两个问题的:

  • 回调地狱,代码难以维护, 常常第一个的函数的输出是第二个函数的输入这种现象

  • promise可以支持多个并发的请求,获取并发请求中的数据

  • 这个promise可以解决异步的问题,本身不能说promise是异步的

二、基本用法

创建一个Promise对象的基本语法如下:

使用Promise,我们可以这样处理异步操作:

或者,使用.catch()方法专门捕获错误:

链式调用与Promise.all/Promise.race

Promise的另一个强大特性是支持链式调用,这使得我们可以将多个异步操作串联起来,依次执行。

此外,Promise.all()Promise.race()提供了处理多个Promise的方法:

  • Promise.all(iterable):接收一个Promise对象的可迭代对象(数组),只有当所有的Promise对象都成功时,才返回一个新的Promise对象,其值为所有Promise对象值的数组。如果有一个失败,则立即返回失败的Promise对象及其原因。

  • Promise.race(iterable):接收一个Promise对象的可迭代对象(数组),只要有一个Promise对象成功或失败,就返回那个已经成功或失败的Promise对象的结果。

实际应用中的Promise

在实际开发中,Promise广泛应用于各种异步场景,如使用fetch进行网络请求:

或者结合async/await语法,让异步代码看起来更像同步代码:


异步编程中的Promise
http://localhost:8090//archives/yi-bu-bian-cheng-zhong-de-promise
作者
曾晓涛
发布于
2024年11月11日
许可协议