167. 面试官:什么是Typescript的方法重载?

167期题目

1. 什么是Typescript的方法重载?
2. 请用TS实现一个JS数组的reduce方法?
3. tsconfig.json有什么作用?

上面问题的答案会在第二天的公众号(程序员每日三问)推文中公布

也可以小程序刷题,已收录500+面试题及答案425f815e3567a61b55f27b71b407b2be.jpeg

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 三个操作有着不同的作用和影响:

  1. 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分钟来学习与思考,在千变万化,类库层出不穷的今天,不要等到找工作时才狂刷题,提倡每日学习。

  • 18
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值