Promise 的四种常用方法。

本文介绍Promise的基本用法及高级应用场景,包括处理异步回调、多个异步函数的同步处理、异步依赖处理以及错误处理的方法。

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

前言

看到项目里不少人用了Promise 的库类,比如 bluebird、q 、jQuery.Deffered 等 polyfill promise 方式,使用的时候翻看长长的文档,真心累觉不爱。
es5 发展到现在,node 在0.12版本就已经支持了promise, 在客户端,大部分浏览器也支持了Promise, 如果要兼容低版本的浏览器,可以加上es5-shimpolyfill promise

用法

Promise 常用三个场景。

  • 处理异步回调

  • 多个异步函数同步处理

  • 异步依赖异步回调

  • 封装统一的入口办法或者错误处理

处理异步回调

Promise 的基本用法, 处理异步回调。

function Pro1(){
    return new Promise(function(resolve, reject) {
        setTimeout(function(){
            resolve('pro1')
        }, 300)
    })
}
//调用
Pro1()
.then(function(data){
    console.log(data) //pro1
})
.catch(function(err){
    throw new Error(err)
})

多个异步函数同步处理

有时候我们需要发送两个ajax,希望他们能一起把数据返回,就可以采用下面的办法。

function Pro1(){
    return new Promise(function(resolve, reject) {
        setTimeout(function(){
            resolve('pro1')
        }, 300)
    })
}
function Pro2(){
    return new Promise(function(resolve, reject) {
        setTimeout(function(){
            resolve('pro2')
        }, 300)
    })
}
//调用
var Pro = Promise.all([Pro1(), Pro2()]);
Pro
.then(function(data){
    console.log(data[0], data[1]) //Pro1 Pro2
})
.catch(function(err){
    throw new Error(err)
})

异步依赖异步回调

有些场景是一个异步依赖另一个异步的返回值的,就可以采用下面的用法。
比如: 用一个订单号异步取到订单详情,再用订单详情里的商品Id获取到商品详情。

function Pro1(orderId){
    return new Promise(function(resolve, reject) {
        setTimeout(function(){
            var orderInfo = {
                orderId: orderId,
                productIds: ['123', '456']
            }
            resolve(orderInfo.productIds)
        }, 300)
    })
}
function Pro2(productIds){
    return new Promise(function(resolve, reject) {
        setTimeout(function(){
            var products = productIds.map(function(productId){
                return {
                    productId: productId,
                    name: '衣服'
                }
            })
            resolve(products)
        }, 300)
    })
}
//调用

Pro1('abc123')
.then(function(productIds){
    console.log('商品id',productIds) 
    return Pro2(productIds)
})
.then(function(products){
    console.log('商品详情',products) 
})
.catch(function(err){
    throw new Error(err)
})

封装统一的入口办法或者错误处理

错误处理
function ErrorHandler(promiseObj, rejectOrResOrCallback){
    return promiseObj.then(null, function(err){
    if(!err)
    })
}
### Promise常用方法详解 JavaScript 中的 `Promise` 提供了多种方法用于处理异步操作,包括创建、组合和控制多个 Promise 的执行流程。以下是对 Promise 常用方法的详细说明。 #### 1. `Promise.resolve(value)` 该方法返回一个以给定值解析后的 `Promise` 对象。如果传入的值是一个 Promise,则返回该对象本身;否则,返回一个新的以该值为结果的 Promise。此方法在将已有值包装为 Promise 时非常有用。 ```javascript const resolvedPromise = Promise.resolve('Already resolved'); resolvedPromise.then(value => console.log(value)); // 输出: Already resolved ``` #### 2. `Promise.reject(reason)` 此方法返回一个以指定原因拒绝的 Promise,适用于需要立即触发错误处理的场景。 ```javascript const rejectedPromise = Promise.reject('Something went wrong'); rejectedPromise.catch(error => console.error(error)); // 输出: Something went wrong ``` #### 3. `Promise.all(iterable)` 该方法接收一个 Promise 可迭代对象(如数组),并返回一个新的 Promise。当所有输入的 Promise 都成功完成时,它才会以数组形式返回所有 Promise 的结果,顺序与输入顺序一致。若任意一个 Promise 被拒绝,则立即以该拒绝原因结束。 ```javascript const p1 = Promise.resolve(3); const p2 = new Promise((resolve, reject) => setTimeout(resolve, 100, 'foo')); const p3 = new Promise((resolve, reject) => setTimeout(resolve, 500, 'bar')); Promise.all([p1, p2, p3]) .then(values => console.log(values)) // 输出: [3, "foo", "bar"] .catch(error => console.error('其中一个Promise被拒绝:', error)); ``` #### 4. `Promise.allSettled(iterable)` 与 `Promise.all` 类似,但不同之处在于它会等待所有 Promise 完成,无论它们是成功还是失败,并返回一个包含每个 Promise 结果的对象数组。 ```javascript Promise.allSettled([Promise.resolve(1), Promise.reject('出错了'), Promise.resolve(3)]) .then(results => console.log(results)); // 输出: [ // { status: 'fulfilled', value: 1 }, // { status: 'rejected', reason: '出错了' }, // { status: 'fulfilled', value: 3 } // ] ``` #### 5. `Promise.any(iterable)` 此方法接收一组 Promise,并在其中任意一个 Promise 成功时立即返回该结果。如果所有 Promise 都失败,则返回一个拒绝状态的 Promise,其原因为所有失败的汇总。 ```javascript Promise.any([Promise.reject('第一个失败'), Promise.resolve('第二个成功'), Promise.reject('第三个失败')]) .then(value => console.log(value)) // 输出: 第二个成功 .catch(error => console.error('所有Promise都失败:', error)); ``` #### 6. `Promise.race(iterable)` 该方法接收一组 Promise,并在其中任意一个 Promise 状态改变时立即以相同状态结束,无论其是成功还是失败。 ```javascript const p1 = new Promise((resolve, reject) => setTimeout(resolve, 500, '五百毫秒')); const p2 = new Promise((resolve, reject) => setTimeout(reject, 100, '一百毫秒')); Promise.race([p1, p2]) .then(value => console.log(value)) .catch(error => console.error(error)); // 输出: 一百毫秒 ``` #### 7. `Promise.prototype.then(onFulfilled, onRejected)` `then` 方法用于注册当 Promise 状态变为 fulfilled 或 rejected 时的回调函数。它返回一个新的 Promise,从而支持链式调用。 ```javascript fetchData() .then(data => { console.log('第一步处理数据:', data); return data + ' 经过第二步处理'; }) .then(processedData => { console.log(processedData); // 输出: 操作成功 经过第二步处理 }) .catch(error => { console.error('发生错误:', error); }); function fetchData() { return new Promise(resolve => { setTimeout(() => resolve('操作成功'), 1000); }); } ``` #### 8. `Promise.prototype.catch(onRejected)` 此方法用于捕获在 Promise 链中发生的错误。如果在 `then` 链中的任何一步抛出异常或返回一个被拒绝的 Promise,都会触发最近的 `catch` 回调。 ```javascript someAsyncFunction() .then(() => { throw new Error('出错了'); }) .catch(error => { console.error('捕获到错误:', error.message); // 输出: 出错了 }); function someAsyncFunction() { return Promise.resolve(); } ``` #### 9. `Promise.prototype.finally(onFinally)` 无论 Promise 最终状态是 fulfilled 还是 rejected,`finally` 方法都会执行指定的回调函数,通常用于清理资源。 ```javascript fetchData() .then(data => console.log('数据:', data)) .catch(error => console.error('错误:', error)) .finally(() => console.log('操作完成')); ``` ### 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值