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