MST

星途 面试题库

面试题:Node.js 中 Promise 的链式调用原理及应用场景

请解释 Node.js 中 Promise 链式调用的原理是什么,并举例说明在实际前端开发场景中,哪些情况下会用到 Promise 的链式调用。
43.9万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

Promise链式调用原理

  1. 返回值处理:当一个Promise被解决(resolved)或被拒绝(rejected)时,它的.then()方法会返回一个新的Promise。这个新Promise的状态取决于.then()回调函数的返回值。如果回调函数返回一个非Promise值,新Promise会以这个值被解决;如果回调函数返回一个Promise,新Promise的状态会跟随这个返回的Promise。
  2. 错误传递:如果在Promise链中的任何一个Promise被拒绝,后续的.then()回调函数将不会被执行,而是直接跳转到最近的.catch()回调函数(如果有)。如果没有.catch(),这个错误会向上冒泡到全局的未处理拒绝(unhandled rejection)处理程序。
  3. 微任务队列.then()回调函数会被放入微任务队列中,在当前调用栈清空后执行。这确保了Promise链式调用的异步性和顺序性。

实际前端开发场景举例

  1. 数据请求串联
    • 比如在一个电商应用中,首先需要获取用户信息(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);
        });
    
  2. 文件读取与处理
    • 在一个图片处理应用中,需要先读取图片文件(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);
        });