面试题答案
一键面试处理Promise异常避免丢失
- 统一catch处理:在Promise链的最后添加一个
.catch
块,用于捕获整个链条中任何一个Promise抛出的异常。promise1() .then(result1 => promise2(result1)) .then(result2 => promise3(result2)) .catch(error => { console.error('捕获到Promise链中的异常:', error); // 可以在此处进行异常处理,如记录日志、返回友好的错误信息等 });
- 每个Promise中处理:在每个
.then
处理函数中,显式地返回一个新的Promise,并在其.catch
块中处理当前Promise可能抛出的异常,然后重新抛出异常,使异常能够继续传递到链条末尾的统一.catch
块。promise1() .then(result1 => { return new Promise((resolve, reject) => { try { const newResult = promise2(result1); resolve(newResult); } catch (error) { reject(error); } }); }) .then(result2 => { return new Promise((resolve, reject) => { try { const newResult = promise3(result2); resolve(newResult); } catch (error) { reject(error); } }); }) .catch(error => { console.error('捕获到Promise链中的异常:', error); });
长Promise链性能优化
- 并行执行:如果Promise链中的某些操作相互独立,可以使用
Promise.all
将它们并行执行。const promise1 = () => new Promise(resolve => setTimeout(() => resolve('result1'), 1000)); const promise2 = () => new Promise(resolve => setTimeout(() => resolve('result2'), 1500)); Promise.all([promise1(), promise2()]) .then(([result1, result2]) => { // 使用result1和result2进行后续操作 });
- 减少不必要的中间操作:检查Promise链中是否存在一些不必要的中间转换或操作,去除这些冗余操作,以减少计算量。
- 优化异步操作本身:例如,优化数据库查询、网络请求等异步操作的实现,减少其执行时间。如合理设置数据库索引,优化网络请求的参数和频率等。
- 使用async/await:虽然async/await本质上还是基于Promise,但它的语法更简洁,使代码逻辑更清晰,也便于错误处理。并且在阅读和维护上更高效,一定程度上有助于优化代码性能和开发效率。
async function main() { try { const result1 = await promise1(); const result2 = await promise2(result1); const result3 = await promise3(result2); // 使用result3进行后续操作 } catch (error) { console.error('捕获到异常:', error); } } main();