Node.js Promise对象详解:链式调用、异常捕获与常用方法
本文深入解析Node.js中Promise对象的核心用法。通过实例演示如何定义Promise、使用then进行链式调用以模拟同步流程,并重点讲解错误冒泡机制与catch异常捕获。此外,还介绍了finally收尾执行、Promise.all并发控制及Promise.race竞速等常用静态方法,帮助开发者高效处理异步逻辑。
Promise对象概述
本文通过具体实例详细介绍Node.js中Promise对象的使用方法,供读者参考学习。
Promise对象的主要用途是什么?
其核心作用是将异步操作转化为类似同步操作的流程表达,从而简化代码逻辑。
Promise对象的定义
一、Promise对象的定义方式
let flag = true;
const hello = new Promise(function (resolve, reject) {
if (false) {//异步操作成功
resolve("success");
} else {
reject("error");
}
});
链式调用与then方法
二、链式调用与then方法的使用
使用then方法进行调用时,第一个参数用于处理成功回调,第二个参数用于处理失败回调,具体示例如下。
hello.then(
function (value) {
console.log(value)
},
function (err) {
console.log(err)
}
);
接下来分别定义三个方法,通过参数指定延时执行的秒数。
- chenqionghe
- get
- muscle
function chenqionghe(second) {
return new Promise((resolve, reject) => {
setTimeout(function () {
console.log("chenqionghe");
resolve();
}, second * 1000);
})
}
function get(second) {
return new Promise((resolve, reject) => {
setTimeout(function () {
console.log("get");
resolve()
}, second * 1000);
})
}
function muscle(second) {
return new Promise((resolve, reject) => {
setTimeout(function () {
console.log("muscle");
resolve();
}, second * 1000);
})
}
调用方式如下所示。
chenqionghe(3)
.then(function () {
return get(2)
})
.then(function () {
return muscle(1)
});
运行后的输出结果如下。
chenqionghe get muscle
通过这种方式实现了链式调用,使得异步操作看起来像是按顺序同步执行的一样。
如果不使用then进行链式调用,会发生什么情况呢?请看下面的示例。
chenqionghe(3);
get(2);
muscle(1);
运行结果如下。
muscle get chenqionghe
可以看到,虽然chenqionghe是第一个被调用的函数,但由于设置了3秒延时,它却是最后输出内容的。
错误处理机制
重点注意事项:
- Promise对象的错误具有“冒泡”特性,会一直向后传递,直到被捕获为止。这意味着错误总是会被下一个catch语句捕获。
- 通常建议不要在then方法中定义Reject状态的回调函数(即then的第二个参数),而应始终使用catch方法来处理错误。
异常捕获-catch
三、捕获异常与catch方法
chenqionghe(3)
.then(function () {
return get(2)
})
.then(function () {
throw new Error("abc");
return muscle(1)
})
.catch(function (e) {
console.log("异常:" + e.message)
})
;
输出结果如下。
chenqionghe get 异常:abc
需要注意的是,异常本身也是一个Promise对象,因此在catch之后还可以继续执行then。
chenqionghe(3)
.then(function () {
return get(2)
})
.then(function () {
throw new Error("abc");
return muscle(1)
})
.catch(function (e) {
console.log("异常:" + e.message)
})
.then(function () {
console.log("异常后执行")
})
;
运行输出结果如下。
chenqionghe get 异常:abc 异常后执行
收尾执行-finally
四、收尾执行与finally方法
无论操作成功还是抛出异常,finally定义的方法都会执行。
chenqionghe(3)
.then(function () {
return get(2)
})
.then(function () {
throw new Error("abc");
return muscle(1)
})
.catch(function (e) {
console.log("异常:" + e.message)
})
.finally(function () {
console.log("最后都会执行的方法")
})
;
执行输出结果如下。
chenqionghe get 异常:abc 最后都会执行的方法
从本质上看,finally是then方法的一种特例。
其他常用方法
五、其他常用静态方法
all方法
该方法用于将多个Promise实例包装成一个新的Promise实例。
const p = Promise.all([p1, p2, p3]);
- 当p1、p2、p3都执行成功时,会调用p的回调函数,并将p1、p2、p3的返回值作为一个数组传递。
- 如果p1、p2、p3中有一个执行reject,则第一个执行reject方法的返回值会传递给p的回调函数。
race方法
与all类似,race也将多个Promise实例包装成一个新的Promise实例。
不同之处在于,只要p1、p2、p3中有一个实例状态发生改变,最先改变的Promise实例的返回值就会传递给p的回调函数。
resolve方法
用于将现有对象转换为Promise对象。
Promise.resolve('foo')
// 等价于
new Promise(resolve => resolve('foo'))
reject方法
返回一个新的Promise实例,该实例的状态为rejected。
const p = Promise.reject('出错了');
// 等同于
const p = new Promise((resolve, reject) => reject('出错了'))
希望本文所述内容对大家学习Node.js程序设计有所帮助。
D3.js 比例尺与坐标轴的配置详解
2026-11-05 16:54:46
JavaScript怎么遍历对象的Symbol键和不可枚举属性
2026-11-05 13:13:39
封装一个健壮的JS字符串判空工具函数
2026-11-05 12:16:14
JavaScript合并数组的三种常用方法:concat、扩展运算符与push
2026-11-05 11:22:29
JavaScript立即执行函数(IIFE)是什么及基本语法
2026-11-05 10:51:19
