Node.js Promise对象详解:链式调用、异常捕获与常用方法

作者:异步漫步时间:2026-10-23 14:08:07浏览:226

本文深入解析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)
  }
);

接下来分别定义三个方法,通过参数指定延时执行的秒数。

  1. chenqionghe
  2. get
  3. 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秒延时,它却是最后输出内容的。

错误处理机制

重点注意事项:

  1. Promise对象的错误具有“冒泡”特性,会一直向后传递,直到被捕获为止。这意味着错误总是会被下一个catch语句捕获。
  2. 通常建议不要在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]);
  1. 当p1、p2、p3都执行成功时,会调用p的回调函数,并将p1、p2、p3的返回值作为一个数组传递。
  2. 如果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程序设计有所帮助。

作者最新文章