Promise的基本用法简介和特点

本文详细介绍了Promise对象的两大特性:状态不可变性和结果的持久性。并探讨了Promise对象如何简化异步编程,避免回调地狱的问题。同时,文章还列举了Promise的一些局限性,如无法取消等。

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

Promise 对象有以下两个特点。

(1)对象的状态不受外界影响。Promise 对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成,又称 Fulfilled)和 Rejected(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也是 Promise 这个名字的由来,它的英语意思就是「承诺」,表示其他手段无法改变。

(2)一旦状态改变,就不会再变,任何时候都可以得到这个结果。Promise 对象的状态改变,只有两种可能:从 Pending 变为 Resolved 和从 Pending 变为 Rejected。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生了,你再对 Promise 对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。

有了 Promise 对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。此外,Promise 对象提供统一的接口,使得控制异步操作更加容易。

Promise 也有一些缺点。首先,无法取消 Promise,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise 内部抛出的错误,不会反应到外部。第三,当处于 Pending 状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。

声明一个Promise对象
// 方法1
let promise = new Promise ( (resolve, reject) => {
    if ( success ) {
        resolve(a) // pending ——> resolved 参数将传递给对应的回调方法
    } else {
        reject(err) // pending ——> rejectd
    }
} )

// 方法2
function promise () {
    return new Promise ( function (resolve, reject) {
        if ( success ) {
            resolve(a)
        } else {
            reject(err)
        }
    } )
}

### JavaScript 中 Promise基本原理与使用 #### 一、Promise 的定义与作用 Promise 是一种用于处理异步操作的对象,它表示一个最终会完成或失败的操作的结果。通过 `new Promise` 构造函数创建一个新的 Promise 实例[^1]。 ```javascript const myPromise = new Promise((resolve, reject) => { const isSuccess = true; if (isSuccess) { resolve('操作成功'); } else { reject('操作失败'); } }); ``` 上述代码展示了如何创建一个简单的 Promise 实例。当条件满足时调用 `resolve()` 表示成功;如果发生错误,则调用 `reject()` 来传递错误信息[^3]。 --- #### 二、Promise 的核心方法 `.then()` `.then()` 方法用于指定 Promise 成功或失败后的回调函数。它的语法如下: - **单参数形式**: 只提供成功的回调函数。 - **双参数形式**: 提供成功失败的回调函数。 ```javascript myPromise.then( value => console.log(value), // 成功时执行 reason => console.error(reason) // 失败时执行 ); ``` 此代码片段说明了 `.then()` 如何分别处理成功 (`value`) 失败 (`reason`) 的情况[^5]。 --- #### 三、链式调用与返回值 Promise 支持链式调用,允许在一个 `.then()` 的基础上继续附加更多的 `.then()` 或其他方法。每次 `.then()` 都可以返回新的 Promise 对象,从而实现复杂的逻辑流控制。 ```javascript function timeout(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } timeout(100).then(() => { console.log('等待了100毫秒'); return timeout(200); }).then(() => { console.log('又等待了200毫秒'); }); ``` 在这个例子中,第一个 `.then()` 完成后返回了一个新的 Promise,该 Promise 继续被下一个 `.then()` 接收并处理[^4]。 --- #### 四、常见问题及其解决方案 ##### 1. **Promise 抛出异常** 如果在 Promise 内部抛出了未捕获的异常,可以通过 `.catch()` 进行统一处理。 ```javascript new Promise((_, reject) => { throw new Error('内部发生了未知错误'); }).catch(err => { console.error(err.message); // 输出 '内部发生了未知错误' }); ``` 此处展示的是如何利用 `.catch()` 捕捉到 Promise 内部发生的任何异常。 ##### 2. **多个 Promise 并发运行** 对于需要并发执行多个 Promise 场景下,可借助 `Promise.all([])` 方法来管理这些任务的状态集合。 ```javascript const promises = [ Promise.resolve(1), Promise.reject(new Error('第二个失败')), Promise.resolve(3) ]; Promise.all(promises) .then(values => console.log(values)) .catch(err => console.error(err.message)); // 如果任意一个失败则进入 catch ``` 这里解释了 `Promise.all([])` 的行为特点以及其对整体状态的影响[^2]。 --- ### 总结 Promise 不仅简化了传统的回调地狱问题,还提供了更清晰易读的方式去管理组合异步流程。无论是单独还是与其他工具配合使用,都能显著提升程序结构化水平。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值