当前位置:首页 > 科技  > 软件

你必须要知道的,五个Promise高级使用技巧

来源: 责编: 时间:2024-04-09 17:18:18 273观看
导读无论是在开发中还是在面试中 promise 都是一个非常重要的内容。常见的面试中都会问及到 promise.then()、Promise.all 或者配合 async/await 使用的方式。但是,一旦我们遇到更高级别的岗位(比如大厂高P岗位),那么以上这些

无论是在开发中还是在面试中 promise 都是一个非常重要的内容。常见的面试中都会问及到 promise.then()、Promise.all 或者配合 async/await 使用的方式。lhL28资讯网——每日最新资讯28at.com

lhL28资讯网——每日最新资讯28at.com

但是,一旦我们遇到更高级别的岗位(比如大厂高P岗位),那么以上这些知识可能就不够使用了。所以说,咱们今天就来分享 5个promise的“高级”使用技巧,提高对 promise 的理解,帮大家通过高P面试!lhL28资讯网——每日最新资讯28at.com

技巧 1:Promise 顺序执行

当面对必须顺序执行一系列任务的场景时,我们第一时间都会想到 “await”。但是除了 await 之外,使用 Promise 的替代方法可能更加优雅。lhL28资讯网——每日最新资讯28at.com

const requestAry = [() => api.request1(), () => api.request2(), () => api.request3()];// 使用 `await`for (const requestItem of requestAry) { await requestItem();}// 使用promise进行串行执行const finallyPromise = requestAry.reduce( (currentPromise, nextRequest) => currentPromise.then(() => nextRequest()), Promise.resolve() );

该方法使用“then”函数,可以简洁高效地连接 Promise,确保任务的串行执行。lhL28资讯网——每日最新资讯28at.com

技巧 2: Async/Await 的替代用法

使用 async/await 作为接收异步函数返回值的这种方式大家应该都比较熟悉,但很少有人认识到异步函数从根本上来说是返回一个 promise。lhL28资讯网——每日最新资讯28at.com

我们来看下面这个场景lhL28资讯网——每日最新资讯28at.com

const fn1 = async () => 1;const fn2 = () => Promise.resolve(1);fn1(); // 返回值为1的promise对象

通常,await 与 Promise 对象一起使用,等待 promise 被解析。 因此,等待 fn1 函数也相当于以下内容:lhL28资讯网——每日最新资讯28at.com

await fn1();-----const promiseInst = fn1();await promiseInst;

但是,对于 await 大家需要知道:当后面的值不是 Promise 对象时,它将会把该值包装在 Promise 对象中。 因此,await之后的代码必须异步执行:lhL28资讯网——每日最新资讯28at.com

Promise.resolve().then(() => { console.log(1);});await 2;console.log(2);// 输出: 1 2

这相当于:lhL28资讯网——每日最新资讯28at.com

Promise.resolve().then(() => { console.log(1);});Promise.resolve().then(() => { console.log(2);});

技巧 3:promise 处理连续的请求

当先前的请求仍处于 待处理状态 时发送重复的请求可能会导致不必要的资源消耗。lhL28资讯网——每日最新资讯28at.com

request('GET', '/test-api').then(response1 => { // …});request('GET', '/test-api').then(response2 => { // …});

并且这种场景非常常见:lhL28资讯网——每日最新资讯28at.com

  • 在页面上渲染多个内部组件同时获取数据时。
  • 处理提交按钮未禁用,用户连续点击多次的场景。
  • 预加载数据时,在预加载完成前导航至预加载页面。

所以,我们可以对 promise 进行对应的封装处理,利用 缓存策略 解决这个问题,可以参考以下代码:lhL28资讯网——每日最新资讯28at.com

// 缓存对象const pendingPromises = {};function request(type, url, data) {   const requestKey = JSON.stringify([type, url, data]);   // 读取缓存   if (pendingPromises[requestKey]) {     return pendingPromises[requestKey];   }  const fetchPromise = fetch(url, {     method: type,     data: JSON.stringify(data)  })   .then(response => response.json())   .finally(() => {     delete pendingPromises[requestKey];   });   // 存入缓存  return pendingPromises[requestKey] = fetchPromise;}

技巧 4:解码 then/catch/finally 返回值

我们知道 promise 拥有三种状态的返回值:lhL28资讯网——每日最新资讯28at.com

.then 处理

// 返回新的 Promise(resolve => resolve(1))Promise.resolve().then(() => 1); // 返回新的 Promise(resolve => resolve(Promise.resolve(2)))Promise.resolve().then(() => Promise.resolve(2)); // 返回新的 Promise(resolve => resolve(Promise.reject(new Error('abc'))))Promise.resolve().then(() => { throw new Error('abc') }); // 返回新的 Promise(resolve => resolve(2))Promise.reject().then(() => 1, () => 2);

.catch 处理

// 返回新的 Promise(resolve => resolve(3))Promise.reject().catch(() => 3); // 返回新的 Promise(resolve => resolve(promise object calling catch))Promise.resolve().catch(() => 4);

.finally 处理

  • 当finally函数返回非promise值时,它会在finally函数之前返回promise对象。
// 返回 Promise.resolve()Promise.resolve().finally(() => {}); // 返回 Promise.reject()Promise.reject().finally(() => {});
  • 当finally函数的返回值是一个promise时,它会在finally函数之前等待promise解析,然后再返回promise对象。
// 返回处于 pending 状态下的 Promise, 1秒后 resolve 为 5。Promise.resolve(5).finally(() => new Promise(res => { setTimeout(res, 1000);})); Promise.reject(6).finally(() => new Promise(res => { setTimeout(res, 1000);})); // 返回处于 pending 状态下的 Promise, 在1秒后 reject 为 6。

技巧 5:区分“then”的第二个回调和“catch”回调

promise 有两种处理错误的方式,分别是:lhL28资讯网——每日最新资讯28at.com

  • .then 的第二个参数回调函数
  • .catch 回调

当请求出现错误时,第二个回调函数和 Promise 的 .catch 都会被触发。lhL28资讯网——每日最新资讯28at.com

乍一看,它们好像没什么区别,但是——前者(第二个参数回调函数)无法捕获“then”当前第一个回调函数中抛出的错误,而“catch”可以:lhL28资讯网——每日最新资讯28at.com

Promise.resolve().then( () => { throw new Error('成功的回调出现错误'); }, () => { // 这里不会执行 }).catch(reason => { console.log(reason.message); // 成功的回调出现错误});

本文链接:http://www.28at.com/showinfo-26-82357-0.html你必须要知道的,五个Promise高级使用技巧

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 微软新专利探索声音 AI 应用,可预估地震、风暴等自然灾害

下一篇: 聊聊2024最活跃的前端框架是哪个?Vue、React、Angular、Svelte、Ember?

标签:
  • 热门焦点
  • 小米官宣:2023年上半年出货量中国第一!

    今日早间,小米电视官方微博带来消息,称2023年小米电视上半年出货量达到了中国第一,同时还表示小米电视的巨屏风暴即将开始。“公布一个好消息2023年#小米电视上半年出货量中国
  • 把LangChain跑起来的三个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来
  • 在线图片编辑器,支持PSD解析、AI抠图等

    自从我上次分享一个人开发仿造稿定设计的图片编辑器到现在,不知不觉已过去一年时间了,期间我经历了裁员失业、面试找工作碰壁,寒冬下一直没有很好地履行计划.....这些就放在日
  • 2023年,我眼中的字节跳动

    此时此刻(2023年7月),字节跳动从未上市,也从未公布过任何官方的上市计划;但是这并不妨碍它成为中国最受关注的互联网公司之一。从2016-17年的抖音强势崛起,到2018年的“头腾
  • 拼多多APP上线本地生活入口,群雄逐鹿万亿市场

    Tech星球(微信ID:tech618)文 | 陈桥辉 Tech星球独家获悉,拼多多在其APP内上线了“本地生活”入口,位置较深,位于首页的“充值中心”内,目前主要售卖美食相关的
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 冯提莫签约抖音公会 前“斗鱼一姐”消失在直播间

    来源:直播观察提起“冯提莫”这个名字,很多网友或许听过,但应该不记得她是哪位主播了。其实,作为曾经的“斗鱼一姐”,冯提莫在游戏直播的年代影响力不输于现
  • 荣耀Magicbook V 14 2021曙光蓝版本正式开售,拥有触摸屏

    荣耀 Magicbook V 14 2021 曙光蓝版本正式开售,搭载 i7-11390H 处理器与 MX450 显卡,配备 16GB 内存与 512GB SSD,重 1.48kg,厚 14.5mm,具有 1.5mm 键盘键程、
  • 世界人工智能大会国际日开幕式活动在世博展览馆开启

    30日上午,世界人工智能大会国际日开幕式活动在世博展览馆开启,聚集国际城市代表、重量级院士专家、国际创新企业代表,共同打造人工智能交流平台。上海市副市
Top