跟着Promise的节奏,让你的代码脱颖而出

简介: 跟着Promise的节奏,让你的代码脱颖而出

Promise简介

Promise(承诺)是JavaScript中的一种异步编程解决方案,用于处理异步操作和避免回调地狱

它可以将异步操作封装成一个对象,通过链式调用来处理异步任务的完成状态(已完成、未完成、已失败)。

Promise有三种状态:

  • pending(进行中)
  • fulfilled(已完成)
  • ejected(已失败)

一旦Promise的状态发生改变,就无法再次变化。

创建Promise对象的方式是使用new关键字调用Promise构造函数,构造函数接受一个执行器函数作为参数。执行器函数会立即执行,并且接受两个参数:resolvereject。在执行器函数中,我们可以执行异步操作,并根据操作的结果调用resolve或reject函数来改变Promise的状态。

下面是一个简单的例子,展示了如何创建和使用Promise:

const myPromise = new Promise((resolve, reject) => {
  // 异步操作,比如发送网络请求等
  const success = true; // 假设请求成功
  if (success) {
    resolve("请求成功"); // 改变Promise状态为fulfilled,并传递一个值给后续的then方法
  } else {
    reject("请求失败"); // 改变Promise状态为rejected,并传递一个错误信息给后续的catch方法
  }
});
myPromise.then((result) => {
  console.log(result); // 请求成功时的处理逻辑
}).catch((error) => {
  console.error(error); // 请求失败时的处理逻辑
});

在上面的代码中,myPromise表示一个异步操作,如果成功,调用resolve函数并传递结果;如果失败,调用reject函数并传递错误信息。然后可以通过调用then方法来处理操作成功的情况,或者通过调用catch方法来处理操作失败的情况。

除了thencatch方法外,Promise还提供了其他一些方法,如finallyallrace等,用于更复杂的异步操作的处理

总结起来,Promise是一种用于处理异步操作的对象,它将异步操作封装成一个可以链式调用的对象,并提供了丰富的方法来处理操作的结果。通过使用Promise,可以更加清晰和简洁地编写异步代码。

Promise实例方法

Promise实例具有以下几个常用的方法:

1. then(onFulfilled, onRejected)

  • 该方法用于注册处理Promise对象状态变为fulfilled(已完成)时的回调函数onFulfilled,以及状态变为rejected(已失败)时的回调函数onRejected
  • 返回一个新的Promise对象,可以通过链式调用来处理异步操作的完成状态。

2. catch(onRejected)

  • 该方法用于注册处理Promise对象状态变为rejected(已失败)时的回调函数onRejected。
  • 返回一个新的Promise对象,可以通过链式调用来处理异步操作的完成状态。

3. finally(onFinally)

  • 该方法用于注册无论Promise对象的状态是fulfilled(已完成)还是rejected(已失败)时都会执行的回调函数onFinally。
  • 返回一个新的Promise对象,可以通过链式调用来处理异步操作的完成状态。

4. Promise.resolve(value)

  • 该方法返回一个状态为fulfilled(已完成)且值为传入value的Promise对象。

5. Promise.reject(reason)

  • 该方法返回一个状态为rejected(已失败)且原因为传入reason的Promise对象。

6. Promise.all(iterable)

  • 该方法接受一个可迭代对象(如数组),并返回一个新的Promise对象。
  • 当可迭代对象中的所有Promise对象都变为fulfilled(已完成)状态时,返回的Promise对象状态也会变为fulfilled,并返回一个由每个Promise对象值组成的数组。
  • 如果可迭代对象中的任意一个Promise对象变为rejected(已失败)状态,则返回的Promise对象状态会立即变为rejected,并传递第一个被拒绝的Promise的原因。

7. Promise.race(iterable)

  • 该方法接受一个可迭代对象(如数组),并返回一个新的Promise对象。
  • 当可迭代对象中的任意一个Promise对象的状态发生改变时(无论是fulfilled还是rejected),返回的Promise对象的状态也会相应地发生改变,且与第一个发生改变的Promise对象保持一致。

这些方法提供了灵活的处理异步操作的方式,可以根据需要进行链式调用、捕获错误、执行最终的清理操作等。

Promise实例方法

Promise原型(prototype)上有以下几个常用的方法:

1. prototype.then(onFulfilled, onRejected)

  • 该方法用于注册处理Promise对象状态变为fulfilled(已完成)时的回调函数onFulfilled,以及状态变为rejected(已失败)时的回调函数onRejected
  • 返回一个新的Promise对象,可以通过链式调用来处理异步操作的完成状态。

2. prototype.catch(onRejected)

  • 该方法用于注册处理Promise对象状态变为rejected(已失败)时的回调函数onRejected
  • 返回一个新的Promise对象,可以通过链式调用来处理异步操作的完成状态。

3. prototype.finally(onFinally)

  • 该方法用于注册无论Promise对象的状态是fulfilled(已完成)还是rejected(已失败)时都会执行的回调函数onFinally
  • 返回一个新的Promise对象,可以通过链式调用来处理异步操作的完成状态。

这些原型方法与实例方法具有相同的功能,可以在Promise实例上直接调用。它们提供了处理异步操作的灵活方式,可以根据需要注册不同的回调函数,处理成功和失败的情况,并在最终完成时执行清理操作。

同时,在原型上还有其他一些方法,例如:

  • prototype.resolve(value): 返回一个状态为fulfilled(已完成)且值为传入value的Promise对象。
  • prototype.reject(reason): 返回一个状态为rejected(已失败)且原因为传入reason的Promise对象。
  • prototype.all(iterable): 静态方法Promise.all()的实现,接受一个可迭代对象(如数组),返回一个新的Promise对象。
  • prototype.race(iterable): 静态方法Promise.race()的实现,接受一个可迭代对象(如数组),返回一个新的Promise对象。

这些原型方法使得我们可以直接在Promise构造函数的原型上调用相应的方法,而不需要创建实例来使用它们。

Promise原型方法和实例方法的对比

以下是Promise原型方法和实例方法的对比总结表格:

方法 作用 在原型上调用 在实例上调用
then 注册处理Promise对象状态变为fulfilled时的回调函数以及状态变为rejected时的回调函数 Promise.prototype.then() promiseInstance.then()
catch 注册处理Promise对象状态变为rejected时的回调函数 Promise.prototype.catch() promiseInstance.catch()
finally 注册无论Promise对象的状态是fulfilled还是rejected时都会执行的回调函数 Promise.prototype.finally() promiseInstance.finally()
resolve 返回一个状态为fulfilled且值为传入value的Promise对象 Promise.resolve() 不适用
reject 返回一个状态为rejected且原因为传入reason的Promise对象 Promise.reject() 不适用
all 接受一个可迭代对象,当所有Promise对象都为fulfilled状态时返回一个由每个Promise值组成的数组 Promise.all() 不适用
race 接受一个可迭代对象,返回第一个变为fulfilled或rejected状态的Promise对象的结果 Promise.race() 不适用
其他非实例特有方法 resolve, reject, all, race等方法在原型上实现,用于直接在原型上调用,不需要创建Promise实例 Promise.resolve(), Promise.reject(), 等等 不适用

需要注意的是,原型方法可以直接在Promise构造函数的原型上调用,而实例方法需要在具体的Promise实例上调用。另外,resolverejectallrace等方法是非实例特有的静态方法,用于直接在原型上调用,而不需要创建Promise实例。

这些方法提供了灵活的处理异步操作的方式,并且可通过链式调用来处理多个异步操作的完成状态。

相关文章
|
3月前
|
前端开发 JavaScript 安全
Promise/A+ 规范详解:打造健壮异步代码的必备知识(上)
Promise/A+ 规范详解:打造健壮异步代码的必备知识(上)
Promise/A+ 规范详解:打造健壮异步代码的必备知识(上)
|
3月前
|
前端开发 安全
Promise/A+ 规范详解:打造健壮异步代码的必备知识(下)
Promise/A+ 规范详解:打造健壮异步代码的必备知识(下)
Promise/A+ 规范详解:打造健壮异步代码的必备知识(下)
|
前端开发 JavaScript API
重学前端 17 # Promise里的代码为什么比setTimeout先执行?
重学前端 17 # Promise里的代码为什么比setTimeout先执行?
85 0
重学前端 17 # Promise里的代码为什么比setTimeout先执行?
|
前端开发
手写Promise核心代码
手写Promise核心代码
154 0
|
前端开发
使用Promise过程中resolve或reject后,后面代码还会执行
在日常开发中会用到Promise语法,里面有resolve和reject
2009 0
|
Web App开发 JavaScript 前端开发
前端通信:ajax设计方案(五)--- 集成promise规范,更优雅的书写代码
  距离上一篇博客书写,又过去了大概几个月了,这段时间暂时离开了这个行业,让大脑休息一下。一个人旅行,一个人休息,正好也去完成一个目标 --- 拥有自己的驾照。当然,也把自己晒的黑漆马虎的。不过这一段时间虽然在技术上没有学太多东西,但是在心态上给了自己一个沉淀的机会,感觉自己变得更加沉稳和成熟,感觉这就是自己需要找到的自己,回归自我。
1421 0
|
Web App开发 JavaScript 前端开发
JavaScript进阶之路——认识和使用Promise,重构你的Js代码
  一转眼,这2015年上半年就过去了,差不多一个月没有写博客了,"罪过罪过"啊~~。进入了七月份,也就意味着我们上半年苦逼的单身生活结束了,从此刻起,我们要打起十二分的精神,开始下半年的单身生活。大家一起加油~~   一直以来,JavaScript处理异步都是以callback的方式,在前端开发领域callback机制几乎深入人心。
1117 0
|
1月前
|
前端开发 JavaScript
如何处理 JavaScript 中的异步操作和 Promise?
如何处理 JavaScript 中的异步操作和 Promise?
15 1
|
1月前
|
前端开发 JavaScript
在JavaScript中,什么是promise、怎么使用promise、怎么手写promise
在JavaScript中,什么是promise、怎么使用promise、怎么手写promise
23 4
|
27天前
|
前端开发 JavaScript 开发者
JavaScript 中的异步编程:Promise 和 Async/Await
在现代的 JavaScript 开发中,异步编程是至关重要的。本文将介绍 JavaScript 中的异步编程概念,重点讨论 Promise 和 Async/Await 这两种常见的处理异步操作的方法。通过本文的阐述,读者将能够更好地理解和应用这些技术,提高自己在 JavaScript 开发中处理异步任务的能力。