MST

星途 面试题库

面试题:Node.js Promise链式调用中的错误传递

假设有一个Promise链式调用,如`Promise.resolve().then(func1).then(func2).catch(errorHandler)`,如果func1抛出错误,func2还会执行吗?errorHandler会捕获到这个错误吗?如果func2中也抛出错误,它是如何被处理的?请详细说明并给出代码示例。
42.0万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试
  1. 如果func1抛出错误,func2还会执行吗?
    • func2不会执行。当func1抛出错误时,这个错误会沿着Promise链传递,导致后续的then回调(这里是func2)被跳过。
  2. errorHandler会捕获到这个错误吗?
    • errorHandler会捕获到这个错误。catch块会捕获Promise链中任何一个then回调抛出的错误。
  3. 如果func2中也抛出错误,它是如何被处理的?
    • 如果func2抛出错误,同样会被catch块(即errorHandler)捕获并处理。

代码示例

function func1() {
    throw new Error('func1 error');
}

function func2() {
    console.log('This should not be printed if func1 throws');
}

function errorHandler(error) {
    console.error('Caught error:', error.message);
}

Promise.resolve()
   .then(func1)
   .then(func2)
   .catch(errorHandler);

在上述代码中,func1抛出错误,因此func2不会执行,errorHandler会捕获并打印func1抛出的错误。

如果我们修改代码,让func1不抛出错误,func2抛出错误:

function func1() {
    return 'func1 result';
}

function func2(result) {
    console.log(result);
    throw new Error('func2 error');
}

function errorHandler(error) {
    console.error('Caught error:', error.message);
}

Promise.resolve()
   .then(func1)
   .then(func2)
   .catch(errorHandler);

此时,func1正常执行并返回结果,func2会执行并在执行过程中抛出错误,这个错误会被errorHandler捕获并打印。