面试题答案
一键面试Promise链式调用原理
- 返回值处理:当一个Promise被解决(resolved)或被拒绝(rejected)时,它的
.then()
方法会返回一个新的Promise。这个新Promise的状态取决于.then()
回调函数的返回值。如果回调函数返回一个非Promise值,新Promise会以这个值被解决;如果回调函数返回一个Promise,新Promise的状态会跟随这个返回的Promise。 - 错误传递:如果在Promise链中的任何一个Promise被拒绝,后续的
.then()
回调函数将不会被执行,而是直接跳转到最近的.catch()
回调函数(如果有)。如果没有.catch()
,这个错误会向上冒泡到全局的未处理拒绝(unhandled rejection)处理程序。 - 微任务队列:
.then()
回调函数会被放入微任务队列中,在当前调用栈清空后执行。这确保了Promise链式调用的异步性和顺序性。
实际前端开发场景举例
- 数据请求串联:
- 比如在一个电商应用中,首先需要获取用户信息(
getUserInfo
),然后根据用户信息获取用户的订单列表(getUserOrders
)。
function getUserInfo() { return new Promise((resolve, reject) => { // 模拟异步请求 setTimeout(() => { resolve({ name: 'John', id: 1 }); }, 1000); }); } function getUserOrders(user) { return new Promise((resolve, reject) => { setTimeout(() => { resolve([{ orderId: 101, product: 'Book' }, { orderId: 102, product: 'Pen' }]); }, 1000); }); } getUserInfo() .then(user => { return getUserOrders(user); }) .then(orders => { console.log('User orders:', orders); }) .catch(error => { console.error('Error:', error); });
- 比如在一个电商应用中,首先需要获取用户信息(
- 文件读取与处理:
- 在一个图片处理应用中,需要先读取图片文件(
readImageFile
),然后对读取的图片数据进行处理(processImageData
)。
function readImageFile() { return new Promise((resolve, reject) => { // 模拟异步文件读取 setTimeout(() => { resolve('image data'); }, 1000); }); } function processImageData(data) { return new Promise((resolve, reject) => { setTimeout(() => { resolve('processed image data'); }, 1000); }); } readImageFile() .then(data => { return processImageData(data); }) .then(processedData => { console.log('Processed image data:', processedData); }) .catch(error => { console.error('Error:', error); });
- 在一个图片处理应用中,需要先读取图片文件(