167期题目
1. 什么是Typescript的方法重载?
2. 请用TS实现一个JS数组的reduce方法?
3. tsconfig.json有什么作用?
上面问题的答案会在第二天的公众号(程序员每日三问)推文中公布
也可以小程序刷题,已收录500+面试题及答案
166期问题及答案
1. 实现一个批量请求函数,要求能够限制并发量?
你可以使用 JavaScript 中的 Promise 和 async/await 实现一个批量请求函数,并通过控制并发量来限制同时发起的请求数量。以下是一个简单的示例代码:
async function batchRequest(urls, concurrencyLimit) {
const results = [];
const executing = [];
for (const url of urls) {
const promise = fetch(url); // 假设使用 fetch 函数发送网络请求
results.push(promise);
const combined = Promise.resolve(promise).then(() => {
executing.splice(executing.indexOf(combined), 1);
});
executing.push(combined);
if (executing.length >= concurrencyLimit) {
await Promise.race(executing);
}
}
return Promise.all(results);
}
在这个示例中,batchRequest
函数接受一个 URL 列表和并发限制参数。它创建一个空数组 results
用于存储请求的 Promise 对象,以及一个数组 executing
用于存储当前正在执行的 Promise 对象。然后遍历 URL 列表,对每个 URL 创建一个 Promise 对象并添加到 results
数组中。通过 Promise.race(executing)
控制并发量,当正在执行的 Promise 达到并发数上限时,函数会等待直到其中一个请求完成。
你可以根据自己的需求调整这个函数,比如替换网络请求部分或者处理结果的方式。
2. git 中 rebase、reset、revert 有什么区别?
在 Git 中,rebase、reset 和 revert 三个操作有着不同的作用和影响:
Rebase:
git rebase
用于重新设置分支的基点,实质上是将一系列提交复制到另一个分支上,并且重新应用到目标分支的最新提交之上。这样可以使提交历史更加清晰,但也可能带来提交变基(rebase)的风险。适用于在合并分支时保持提交历史的整洁性,可以用交互式 rebase 来重新整理提交历史。
Reset:
git reset
用于撤销提交或者移动当前分支的HEAD指针。它可以以不同的模式(--soft
、--mixed
、--hard
)来重置暂存区和工作区的内容,并移动当前分支的指向。这可能对提交历史造成破坏性的影响,因此谨慎使用。每种模式有不同的效果:
--soft
仅移动HEAD;--mixed
移动HEAD并重置暂存区;--hard
移动HEAD并重置暂存区和工作区。
Revert:
git revert
用于撤销一个或多个指定的提交,它会创建新的提交来撤销之前的提交,而不会修改历史记录。这使得撤销操作是安全的,并且可以在多人协作的项目中使用。适用于要撤销已发布的历史提交时使用,因为它不会改变提交历史。
综上所述,rebase 重写提交历史,reset 移动分支的指针来修改提交,revert 撤销指定的提交而不影响提交历史。选择合适的操作取决于你想要达到的效果以及当前的工作流程。
3. Promise 的 finally 怎么实现的?
在 JavaScript 中,Promise 的 finally
方法用于注册一个在 Promise 结束时,不论是成功还是失败都会执行的回调函数。以下是一个简单的示例来说明 finally
是如何实现的:
Promise.prototype.finally = function(callback) {
let promise = this.constructor.resolve(callback());
return this.then(
result => promise.then(() => result),
reason => promise.then(() => { throw reason; })
);
};
在这个示例中,首先我们扩展了 Promise 的原型,加入了 finally
方法。然后在 finally
方法中,我们创建了一个新的 Promise 对象,并在原Promise的 then
方法中返回这个新的 Promise。在 then
方法中,通过 promise.then
来确保在当前Promise的状态变为完成(无论是成功还是失败)时都会执行 callback
函数。如果当前Promise是成功状态,finally
返回的新Promise会以成功状态解析并传递原Promise的结果;如果当前Promise是失败状态,finally
返回的新Promise会以失败状态拒绝并传递原Promise的拒因。
这样,通过 finally
方法我们可以注册一个回调,在 Promise 结束时无论成功与否都会被调用。这在一些需要清理操作或者无论如何都需要执行的逻辑时非常有用。
因为微信公众号修改规则,如果不标星或点在看,你可能会收不到我公众号文章的推送,原创不易,请大家将本公众号星标,看完文章后记得点下赞或者在看,谢谢各位!
学习不打烊,充电加油只为遇到更好的自己,每天早上9点纯手工发布面试题,每天坚持花20分钟来学习与思考,在千变万化,类库层出不穷的今天,不要等到找工作时才狂刷题,提倡每日学习。