promise:一文理解promise常用的方法

本文详细介绍了Promise在JavaScript中的概念、状态转换、构造函数、常用的resolve/reject方法,以及Promise.all、Promise.race、finally和then/catch等特性,帮助读者掌握异步编程中的解决方案和避免回调地狱。

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

目录

第一章 介绍promise

1.1 简介

1.2 什么是地域回调

第二章 promise理论

2.1 promise的状态

2.2 promise对象的值

2.3 promise构造函数

2.4 Promise.resolve()与Promise.reject()

2.5 promise常用的几种方法 

2.5.1 Promise.all(promises)

2.5.2 Promise.race(promises)

2.5.3 Promise.finally

2.6 promise状态修改

2.7 promise执行多个回调 

2.8 改变promise状态和指定回调函数(.then)执行顺序

2.9 then方法返回的结果由什么决定

2.10  promise串联多个任务

2.11 异常穿透现象catch

2.12 中段promise链


第一章 介绍promise

1.1 简介

Promise 是ES6 新增的一个异步调用解决方案,它的出现是为了解决异步函数的 回调地狱 的问题

1.2 什么是地域回调

  • "回调地域":指的是编程当中"多级的异步的嵌套调用"的问题
  • 简单的说就是一个函数里面又套用了一个函数,跟“套娃”一样,当然,如果回调函数少的话,问题还是不是特别大,嵌套的函数很多时,如果这嵌套内的一个函数出现了问题,那么我们一下定位不到问题所在。

第二章 promise理论

let p = new Promise((resolve,reject)=>{
    resolve('ok')
})
console.log('了解promise', p)

  • 我们先了解这3个API,Prototype -> Promise 表示promise类型;PromiseState以及PromiseResult很重要,如下:

2.1 promise的状态

PromiseState 

  • 三种状态:pending(等待态)、resolved/fullfilled(成功态)、rejected(失败态)
  • 只有两种可能的变换 —— 从等待态转变为成功态或者等待态转变为失败态
  1. pending -> resolved/fulllfilled 
  2. pending -> rejected
  • 一个promise对象只能改变一次,状态由等待态发生改变之后就不会再发生改变了
  • 无论成功还是失败都会有一个结果数据
  • 注意该文章:成功的结果一般为value,失败的结果一般为reason

2.2 promise对象的值

PromiseResult 

  • 保存对象(成功/失败)的结果:resolve的结果/reject的结果

2.3 promise构造函数

// promise构造函数
const p = new Promise((resolve, reject) => {
    // 对于(resolve, reject) => {}中的代码是同步执行的代码
    // 执行器函数里面确定返回的状态与值
    // 修改对象的状态为rejected失败状态
    reject('error')
})
// 执行catch方法
p.catch(reason=>{
    console.log('报错',reason)
})

// promise构造函数
const p1 = new Promise((resolve, reject) => {
    // 对于(resolve, reject) => {}中的代码是同步执行的代码
    // 执行器函数里面确定返回的状态与值
    // 修改对象的状态为fulfilled成功状态
    resolve('success')
})
// 执行catch方法
p1.then(value=>{
    console.log('成功',value)
})

Promise(excutor)

  • excutor函数:执行器函数(resolve,reject) =>{}
  • resolve函数:内部定义成功时我们调用的函数value=>{}
  • eject函数:内部定义失败时我们调用的函数reason=>{}
  • 说明:对于excutor执行器函数会在Promise内部立即同步调用,异步在执行器中执行

2.4 Promise.resolve()与Promise.reject()

const p1 = Promise.reject('reject:p1')
const p2 = Promise.resolve('resolve:p2')
const p3 = Promise.resolve('resolve:p3')
const p4 = Promise.resolve(new Promise((resolve, reject) => {
    resolve('resolve-Promise:p4')
}))
console.log(p1,p2,p3,p4)

  • Promise.resolve():返回一个成功的数据/失败的promise对象
  • Promise.reject():返回一个失败的promise对象
  1. 返回一个状态为:rejected失败,结果为:reject:p1的promise对象
  2. 返回一个状态为:fulfilled成功,结果为resolve:p2的promise对象
  3. 返回一个状态为:fulfilled成功,结果为resolve:p3的promise对象
  4. 返回了一个promise对象,状态为fulfilled成功,结果为该promise对象里返回的结果:resolve-Promise:p4

2.5 promise常用的几种方法 

let p1 = new Promise((resolve,reject)=>{
    resolve('ok')
})
// let p2 = Promise.resolve('success')
let p2 = Promise.reject('no')
let p3 = Promise.resolve('yes')
// let p3 = Promise.reject('No')
const resultAll = Promise.all([p1,p2,p3])
const resultRace = Promise.race([p1,p2,p3])
console.log('all', resultAll)
console.log('race', resultRace)

  • promises: 包含n个promise的数组 

2.5.1 Promise.all(promises)

  • 返回一个新的promise只有所有的promise都成功才成功(PromiseResult为每个成功状态的数组), 只要有一个失败就直接失败(PromiseResult为最先失败的那个值)
let p1 = new Promise((resolve,reject)=>{
    resolve('ok')
})
let p2 = Promise.resolve('success')
// let p2 = Promise.reject('no')
let p3 = Promise.resolve('yes')
// let p3 = Promise.reject('No')
const resultAll = Promise.all([p1,p2,p3])
console.log('all', resultAll)

 

2.5.2 Promise.race(promises)

  • 返回一个新的promise,第一个完成的promis的结果状态就是最终的结果状态,不管是失败还是成功
let p1 = new Promise((resolve,reject)=>{
    reject('ok')
})
let p2 = Promise.resolve('success')
// let p2 = Promise.reject('no')
let p3 = Promise.resolve('yes')
// let p3 = Promise.reject('No')
const resultRace = Promise.race([p1,p2,p3])
console.log('race', resultRace)

 

2.5.3 Promise.finally

  • finally方法的回调函数不接受任何参数,也不知道前面的 Promise 状态到底是fulfilled还是rejected,但是最终都会执行finally的方法

2.6 promise状态修改

let p = new Promise((resolve, reject) => {
    // 1、resolve函数 pending==>fullfilled 等待态转变为成功态
    // resolve('ok')
    // 2、resolve函数 pending==>reject 等待态转变为失败态
    // reject('error')
    // 3、抛出错误
    throw '111'
})
console.log(p)
  • 1、resolve函数 pending==>fullfilled 等待态转变为成功态

  • 2、resolve函数 pending==>reject 等待态转变为失败态

  • 3、抛出错误

2.7 promise执行多个回调 

let p = new Promise((resolve, reject) => {
    resolve('ok')
})
p.then(value=>{
    console.log(value)
})
p.then(value=>{
    alert(value)
})
console.log(p)
  • 一个promise指定多个成功/失败回调函数,当promise改变为对应的状态时,都会调用 

2.8 改变promise状态和指定回调函数(.then)执行顺序

let p = new Promise((resolve, reject) => {
    // setTimeout(()=>{
    resolve('ok')
    // },2000)
})
p.then(value=>{
    console.log('value', value)
},reason=>{
    console.log('reason', reason)
})
console.log('p', p)
  •  都有可能,正常情况也可以先改变状态再执行回调,但先执行指定回调再改变状态
  • 如何先改变状态再指定回调?——先在执行器中直接调用resolve()/reject(),再调用.then;
  • 如何先先执行指定回调再改变状态?——在执行器中给resolve()/reject()设置定时器,延迟执行

2.9 then方法返回的结果由什么决定

let p = new Promise((resolve, reject) => {
    resolve('ok');
});
//执行 then 方法
let result = p.then(value => {
    //1. 抛出错误
    throw '出了问题';
    //2. 返回结果是非 Promise 类型的对象
    // console.log("value", value);
    // return 521;
    //3. 返回结果是 Promise 对象
    // return new Promise((resolve, reject) => {
    //     resolve('success');
    //     // reject('error');
    // });
}, reason => {
    console.warn(reason);
});
console.log("result", result);
  • 1、throw抛出错误

 

  • 2、返回结果是非 Promise 类型的对象

-- then方法内部return值,最终promiseState结果为fulfilled,promiseResult结果为return的值

 -- then方法内部直接执行console.log("value", value),不return ,最终promiseState结果为fulfilled,promiseResult结果为return的值,没有return默认undefined

  •  3、返回结果是 Promise 类型的对象

-- 看promise对象返回的时什么值和状态

 

2.10  promise串联多个任务

let p = new Promise((resolve, reject) => {
    setTimeout(()=>{
        resolve('ok')
    },2000)
})
p.then(value=>{
    console.log(value)
    return new Promise((resolve, reject) => {
        resolve('success')
    })
}).then(value=>{
    console.log(value) //success
}).then(value=>{
    console.log(value) //undefined
})
  • promise的then()返回一个新的promise,可以看成then()的链式调用;通过then的链式调用串联多个同步/异步任务

2.11 异常穿透现象catch

let p = new Promise((resolve, reject) => {
    setTimeout(()=>{
        resolve('ok')
    },2000)
})
p.then(value=>{
    console.log(value)
    return new Promise((resolve, reject) => {
        resolve('success')
    })
}).then(value=>{
    console.log(value) //success
    throw '111'
}).then(value=>{
    console.log(value)
}).catch(reason=>{
    console.warn(reason)
})
  • 异常穿透:当使用promisee的链式调用时,可以在最后指定失败的回调;前面任何操作出了异常,都会传到最后失败的回调中处理,之后不再执行后面的回调函数

2.12 中段promise链

let p = new Promise((resolve, reject) => {
    setTimeout(()=>{
        resolve('ok')
    },2000)
})
p.then(value=>{
    console.log(value)
    return new Promise((resolve, reject) => {
        resolve('success')
    })
}).then(value=>{
    console.log(value) //success
    console.log(111)
    // throw '111'
    return new Promise(()=>{})
}).then(value=>{
    console.log(value) //undefined
    console.log(222)
}).then(value=>{
    console.log(value) //undefined
    console.log(333)
}).catch(reason=>{
    console.warn(reason)
})
  • 中断promise链的唯一方法:在回调函数中返回一个pendding状态的promise对象--return new Promise(()=>{})

### Promise 的工作原理 PromiseJavaScript 中处理异步操作的一种核心机制,其设计基于状态管理和回调注册的思想。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、付费专栏及课程。

余额充值