MST
星途 面试题库

面试题:Node.js中Promise对象的状态转换机制

请详细描述Node.js中Promise对象有哪些状态,以及状态之间是如何转换的,在什么情况下会发生状态转换?
22.1万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

Promise对象的状态

  1. Pending(进行中):这是Promise对象的初始状态,表示操作尚未完成。在这个状态下,Promise既没有被解决(resolved),也没有被拒绝(rejected)。例如,当发起一个异步网络请求时,在请求还未得到响应之前,对应的Promise就处于Pending状态。
  2. Fulfilled(已完成):也称为Resolved(已解决)。当异步操作成功完成时,Promise会从Pending状态转换到Fulfilled状态。例如,成功读取一个文件后,对应的Promise就会进入Fulfilled状态,并且可以携带操作成功返回的结果。
  3. Rejected(已拒绝):当异步操作失败时,Promise会从Pending状态转换到Rejected状态。比如读取文件时发生错误,对应的Promise就会进入Rejected状态,并且可以携带错误信息。

状态转换

  1. 从Pending到Fulfilled:当异步操作成功完成时发生。例如,使用fs.readFile读取文件成功时,返回的Promise会从Pending转换到Fulfilled状态。代码示例如下:
const fs = require('fs');
const util = require('util');

const readFilePromise = util.promisify(fs.readFile);

readFilePromise('test.txt', 'utf8')
 .then(data => {
      console.log('文件读取成功:', data);
  });

在上述代码中,readFilePromise返回的Promise在文件成功读取后会进入Fulfilled状态,并通过.then处理成功结果。 2. 从Pending到Rejected:当异步操作遇到错误时发生。例如,在上述读取文件的例子中,如果文件不存在或者读取过程中出现其他错误,Promise就会从Pending转换到Rejected状态。代码示例如下:

const fs = require('fs');
const util = require('util');

const readFilePromise = util.promisify(fs.readFile);

readFilePromise('nonexistent.txt', 'utf8')
 .catch(err => {
      console.log('文件读取失败:', err);
  });

在这个例子中,由于文件不存在,readFilePromise返回的Promise会进入Rejected状态,并通过.catch处理错误。

一旦Promise从Pending状态转换到Fulfilled或Rejected状态,它的状态就被“锁定”,不会再发生改变。也就是说,一个已Fulfilled或已Rejected的Promise不会再变回Pending状态,也不会从Fulfilled转换到Rejected,反之亦然。