promise对象详解

Promise是一个代表未来完成事件结果的容器,提供统一API处理异步操作。它有三种状态:pending、fulfilled和rejected,一旦状态改变即凝固。本文将介绍Promise的基本用法,如创建实例,并展示在加载图片等应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Promise释义

所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。

Promise对象有三个状态:pendingfulfilledrejected
状态只能从pending变为fulfilledrejected两种方式。
Promise对象的状态一旦发生改变,就无法改变,任何时候都可以得到这个状态。
只要状态发生改变后,状态就会凝固,这时候就称为resolved(已定型)

Promise.prototype = {
   
   
  then: function(resolve,reject){
   
   },
  //catch方法是.then(null,rejection)的别名,用于指定发生错误时的回调函数
  catch: function(error){
   
   },
  //all方法用于将多个 Promise 实例,包装成一个新的 Promise 实例
  all: function([p1,...]){
   
   },
  // 多个promise实例中只要有一个状态改变,由race创造的promise实例的状态会立即随之改变
  race: function(){
   
   },
  resolve: function(){
   
   },
  reject: function(){
   
   },
  // 不管Promise对象最后状态如何,都会执行的操作。
  finally: function(){
   
   },
  // 一组异步操作结束后,不管成功还是失败,再进行下一步操作
  allSettled: function(){
   
   },
  // 只要多个Promise实例参数中的一个变成`fulfilled`状态,包装实例就会变成`fulfilled`状态;
  // 如果所有参数实例都变成`rejected`状态,包装实例才会变成`rejected`状态。
  any: function(){
   
   }
}

基本用法

创造一个promise实例

const promise = new Promise(function(resolve, reject) {
   
   
  // ... some code

  if (/* 异步操作成功 */){
   
   
  // resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved)
  // 在异步操作成功时调用,并将异步操作的结果,作为参数传递出去
    resolve(value);
  } else {
   
   
    // reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected)
    // 在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。
    reject(error);
  }
});

// Promise实例生成以后,可以用then方法分别指定resolved状态和rejected状态的回调函数。
promise.then(function(value) {
   
   
  // success
}, function(error) {
   
   
  // failure
});

应用

加载图片

const preloadImage = function (path) {
   
   
  
### Promise 的工作原理 Promise 是 JavaScript 中处理异步操作的一种核心机制,其设计基于状态管理和回调注册的思想。Promise 本质上是一个对象,表示一个异步操作的最终完成(或失败)及其结果值。Promise 有三种状态:`pending`(等待态)、`fulfilled`(成功态)和 `rejected`(失败态)。一旦状态发生变化,就不会再变,这种状态的不可逆性是 Promise 的核心特性之一[^2]。 在内部实现上,Promise 采用了发布-订阅模式。当异步操作尚未完成时,Promise 处于 `pending` 状态,此时可以通过 `then` 方法注册回调函数,等待状态变为 `fulfilled` 或 `rejected` 时触发相应的回调。这种机制类似于事件监听,但更结构化和可控,避免了传统回调地狱的问题[^3]。 Promise 的执行是同步的,构造一个 Promise 实例时,其传入的执行函数会立即执行,但其内部的异步操作(如 setTimeout)会进入事件循环的微任务队列,等待当前同步任务执行完毕后才被处理。这使得 Promise 具有良好的调度顺序[^1]。 ### Promise 的使用方法 #### 基本结构 ```javascript const promise = new Promise((resolve, reject) => { // 异步操作 if (/* 成功 */) { resolve(value); // 成功状态 } else { reject(error); // 失败状态 } }); ``` #### 链式调用 Promise 支持链式调用,通过 `then` 方法可以依次处理异步操作的结果,每个 `then` 返回一个新的 Promise,从而实现异步流程控制: ```javascript promise .then(value => { console.log('Success:', value); return value + 1; }) .then(newValue => { console.log('New value:', newValue); }) .catch(error => { console.error('Error:', error); }); ``` #### 错误处理 Promise 的错误处理通过 `catch` 方法进行,它可以捕获链式调用中任意一个环节抛出的错误。建议始终使用 `catch` 来统一处理错误,以避免未捕获的 Promise rejection 导致程序崩溃。 #### 静态方法 Promise 构造函数自身提供了一些静态方法,用于处理多个 Promise 的组合和控制: - `Promise.resolve(value)`:返回一个以给定值解析Promise。 - `Promise.reject(reason)`:返回一个以给定原因拒绝的 Promise。 - `Promise.all(iterable)`:接收一个 Promise 数组,全部成功才成功,有一个失败就立即失败。 - `Promise.race(iterable)`:接收一个 Promise 数组,只要有一个 Promise 状态改变,就触发后续操作。 ### 常见问题与注意事项 - **避免未处理的 rejection**:如果一个 Promise 被拒绝但没有对应的 `catch` 捕获,可能导致程序运行异常。应始终为 Promise 链添加错误处理。 - **链式调用中的返回值**:在 `then` 中返回的值会作为下一个 `then` 的输入。若返回的是另一个 Promise,则会等待该 Promise 解析后再继续执行链式流程。 - **异步顺序问题**:由于 Promise 使用微任务队列,其回调执行顺序优先于 `setTimeout` 等宏任务,但在多个 Promise 回调之间仍然遵循注册顺序。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值