promise常用的api

promise.all():传递多个参数,成功之后,接受value 为数组,一旦有一个promise对象失败,会调用失败原因,不会返回其他函数执行结果

promise.reject() :直接调用失败函数

promise.resolve() 直接调用成功函数

promise.rece():传递多个promise参数,只返回第一个执行结束的参数。

<think>好的,用户现在问的是“Promise常用API有哪些”。首先,我需要确定用户对Promise的了解程度。可能用户已经有一定的JavaScript基础,但想更系统地了解Promise的相关方法。用户可能是在开发中遇到了异步处理的问题,或者想要优化现有的异步代码结构。 接下来,我需要回忆Promise的核心API。首先想到的是Promise构造函数,then、catch、finally这些实例方法。然后是静态方法,比如Promise.all、Promise.race、Promise.allSettled、Promise.any,还有Promise.resolve和Promise.reject。 用户可能想知道每个API的用途和基本用法,所以需要给出清晰的解释和示例。比如,Promise.all用于处理多个并行异步操作,当所有都成功时返回结果数组,有一个失败就整体失败。而Promise.race则是谁先完成就返回谁的结果,无论成功还是失败。 还要注意区分不同方法的适用场景。例如,Promise.allSettled在需要知道所有Promise的结果时使用,不管成功或失败。而Promise.any则是取第一个成功的Promise,这在需要至少一个成功的情况下很有用。 另外,用户可能对错误处理比较关注,所以需要强调catch和finally的作用。catch用于捕获链式调用中的错误,而finally无论成功失败都会执行,适合做清理工作。 还要考虑用户可能对较新的方法(如Promise.any)不太熟悉,需要给出兼容性说明,比如ES2021引入,可能需要polyfill。 最后,总结这些API的使用场景,帮助用户根据实际需求选择合适的方法。确保内容结构清晰,分点说明,每个方法都有示例代码,方便用户理解和应用。</think>以下是 JavaScript Promise常用 API 及其核心用法详解: --- ### 一、构造函数 #### 1. `new Promise(executor)` ```javascript const promise = new Promise((resolve, reject) => { // 异步操作 setTimeout(() => resolve('成功'), 1000) }) ``` - **作用**:创建 Promise 对象 - **参数**:executor 函数包含 `resolve` 和 `reject` 两个参数 - **特点**:立即执行 executor 函数 --- ### 二、实例方法 #### 1. `.then(onFulfilled, onRejected)` ```javascript promise.then( value => console.log(value), // 成功回调 error => console.error(error) // 失败回调(可选) ) ``` - **作用**:处理 Promise 的完成/拒绝状态 - **链式调用**:返回新 Promise 对象 - **示例**:`fetch(url).then(res => res.json())` #### 2. `.catch(onRejected)` ```javascript promise.catch(error => { console.error('捕获错误:', error) }) ``` - **本质**:`.then(null, onRejected)` 的语法糖 - **最佳实践**:建议在链式调用末尾统一处理错误 #### 3. `.finally(onFinally)` ```javascript promise.finally(() => { console.log('无论成功失败都会执行') }) ``` - **特点**: - 不接收任何参数 - 总会执行 - 返回原始 Promise 对象 --- ### 三、静态方法 #### 1. `Promise.resolve(value)` ```javascript Promise.resolve(42) // 创建立即解决的 Promise .then(v => console.log(v)) // 输出 42 ``` - **等效写法**:`new Promise(resolve => resolve(value))` - **特殊处理**:如果参数是 Promise 对象,则直接返回该对象 #### 2. `Promise.reject(reason)` ```javascript Promise.reject(new Error('失败')) .catch(err => console.log(err.message)) // 输出 "失败" ``` #### 3. `Promise.all(iterable)` ```javascript const promises = [ fetch('/api1'), fetch('/api2'), fetch('/api3') ] Promise.all(promises) .then(results => { console.log('所有请求完成:', results) }) .catch(err => { console.log('某个请求失败:', err) }) ``` - **特点**: - 全部成功时返回结果数组 - 任意失败立即拒绝 - 保持结果顺序与输入一致 #### 4. `Promise.race(iterable)` ```javascript const timeout = new Promise((_, reject) => { setTimeout(() => reject('超时'), 5000) }) Promise.race([fetch('/api'), timeout]) .then(data => console.log('及时响应')) .catch(err => console.log('超时或错误')) ``` - **特点**:取第一个完成(成功/失败)的 Promise 结果 #### 5. `Promise.allSettled(iterable)` (ES2020) ```javascript Promise.allSettled(promises) .then(results => { results.forEach((result, index) => { if (result.status === 'fulfilled') { console.log(`Promise ${index} 成功:`, result.value) } else { console.log(`Promise ${index} 失败:`, result.reason) } }) }) ``` - **特点**:等待所有 Promise 完成(无论成功/失败) - **输出结构**:对象数组包含 `status`、`value`/`reason` #### 6. `Promise.any(iterable)` (ES2021) ```javascript Promise.any(promises) .then(firstSuccess => { console.log('首个成功的 Promise:', firstSuccess) }) .catch(err => { console.log('全部失败:', err.errors) }) ``` - **特点**: - 取第一个成功的 Promise - 全部失败时返回 `AggregateError` --- ### 四、进阶用法 #### 1. 组合使用示例 ```javascript // 超时控制 + 错误重试 function fetchWithRetry(url, retries = 3) { return new Promise((resolve, reject) => { const attempt = n => { fetch(url) .then(resolve) .catch(err => { if (n > 0) attempt(n - 1) else reject(err) }) } attempt(retries) }) } ``` #### 2. 取消 Promise 模式 ```javascript function cancelablePromise(promise) { let isCanceled = false const wrappedPromise = new Promise((resolve, reject) => { promise.then( value => !isCanceled && resolve(value), error => !isCanceled && reject(error) ) }) return { promise: wrappedPromise, cancel() { isCanceled = true } } } ``` --- ### 五、兼容性注意 | 方法 | 支持版本 | |--------------------|---------------| | `.finally()` | ES2018 | | `Promise.allSettled()` | ES2020 | | `Promise.any()` | ES2021 | --- ### 六、最佳实践 1. **错误冒泡**:使用 `catch` 统一处理错误 2. **状态不可逆**:Promise 状态一旦改变不可撤回 3. **避免嵌套**:使用链式调用替代嵌套 Promise 4. **性能优化**:合理使用 `Promise.all` 进行并行操作 5. **内存管理**:及时处理未使用的 Promise 引用 掌握这些 API 可以显著提升异步代码的可读性和可维护性,建议结合 `async/await` 语法使用效果更佳。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值