每天一道面试题(12) - resolve(reject(1))走then还是catch

之前面试时遇到这个问题, 当时脑子不太好使没想到这道题的考察点是什么.

后来复盘了一下才反应过来这道题考的是函数调用栈啊!

什么是函数调用栈

定义参考链接

程序在运行期间,内存中有一块区域,用来实现程序的函数调用机制。这块区域是一块LIFO的数据结构区域,我们可以叫函数栈(调用栈)。

每个未退出的函数都会在函数栈中拥有一块数据区,我们叫函数的栈帧。函数的调用栈帧中,保存了相应的函数的一些重要信息:函数中使用的局部变量,函数的参数,另外还有一些维护函数栈所需要的数据.

resolve(reject(1))走then还是catch

答案, 显而易见, 走到catch里;

函数调用栈的其他问题场景

函数调用栈还有一些其他场景, 比如

1. 闭包

当一个函数return的是另一个函数时, 这个函数的调用帧不会被删除, 仍然保存着当前函数的上下文, 所以也不会被垃圾回收, 滥用会造成内存泄漏

2. 尾调用和尾递归

这个讲起来有点复杂, 具体可以查看阮大大的ES6教程中关于尾递归优化那一节
简单说来就是, 在尾递归时, 函数调用栈中只会保存一个调用帧, 大大节省了资源

等等

明天开始休假啦, 就不更新了
祝大家假期快乐~~~

### 关于 Promise 的常见面试题及解答 #### 1. 创建并返回一个立即解析的 Promise 对象 创建一个立即被解析为给定值的 `Promise` 对象。 ```javascript const immediateResolve = value => { return new Promise(resolve => resolve(value)); }; immediateResolve(42).then(console.log); // 输出: 42 ``` 此方法展示了如何通过构造函数快速构建已成功状态下的承诺对象[^2]。 #### 2. 处理多个并发 Promises 并收集所有结果 当需要等待一组异步操作完成时可以使用 `Promise.all()` 方法来处理这些情况。该方法接收一个由 promises 组成的数组作为参数,并返回一个新的 promise,这个新的 promise 将会在所有的输入 promises 被解决之后才会被解决,并且会把所有输入 promises 结果组成的一个列表传递给其回调函数。 ```javascript function fetchMultipleUrls(urls) { const requests = urls.map(url => fetch(url).then(response => response.json()) ); return Promise.all(requests); } fetchMultipleUrls(['url1', 'url2']).then(dataList => console.log(dataList)); // 所有请求完成后打印数据集合 ``` 这段代码说明了怎样利用 `Promise.all()` 来有效地管理多任务的同时执行以及获取它们的结果集。 #### 3. 实现带有重试机制的 Promise 函数 对于某些可能失败的操作来说,提供一种自动重新尝试的能力是非常有用的。下面是一个简单的例子,实现了具有指定次数重试功能的通用工具函数: ```javascript function retryPromise(cb, retriesLeft = 3, interval = 1000) { return new Promise((resolve, reject) => { cb().then( res => resolve(res), err => { setTimeout(() => { if (retriesLeft === 1) { reject(err); return; } retryPromise(cb, retriesLeft - 1, interval).then(resolve, reject); }, interval); } ); }); } ``` 上述实现允许传入自定义的最大重试次数和每次重试之间的间隔时间,从而提高了灵活性与实用性[^3]。 #### 4. 使用 catch() 捕获错误 如果任何一个链接中的 promise 发生拒绝,则整个链条都会跳转至最近一次调用 `.catch()` 或者后续任何地方设置的错误处理器那里去继续运行流程。 ```javascript new Promise((_, reject) => { throw "Oops!"; }).catch(error => { console.error('Caught error:', error); // Caught error: Oops! }); ``` 这里展示了一个基本的例子,其中抛出了异常并且被捕获到了链上的第一个可用的`.catch()` 中[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值