代码优化及编程习惯

简介: 代码优化及编程习惯

代码

避免 Promise.all 使用


  • Promise.all: 彼此相互依赖或者在其中任何一个reject时立即结束。
  • Promise.allSettled: 所有给定的 promise 都已经 fulfilled 或 rejected 后的 promise,并带有一个对象数组,每个对象表示对应的 promise 结果。

示例:

constpromise1=Promise.resolve(3);
constpromise2=newPromise((resolve, reject) =>setTimeout(reject, 100, 'foo'));
constpromises= [promise1, promise2];
Promise.allSettled(promises).
then((results) =>results.forEach((result) =>console.log(result.status)));
// expected output:// "fulfilled"// "rejected"

目前大部分 Promise.all 使用的场景下,是多个任务并行执行,其中某个失败了也依然需要保证其他任务执行完毕。

p.s. 如果并发任务中有外部请求(如 HTTP Request、数据库查询连接创建等),不要用 Promise.allSettled, 而要自行封装 Promise.parallel 或者使用队列、Pooling(池)等方式去优化处理。

Async / Await 语法糖优化

// 没必要的 async / awaitasyncfunctiondemo1(): Promise<any> {
// 如果方法体内 没有 await 语法糖, 则不需要添加 async// 即便 return 方法为一个 Promise 返回值,也不需要添加 asyncreturnawaitsomeService.somePromiseFunction();
// 如果方法体内 只在 return 部分有一个 await,建议优化掉, 去掉 await 和方法体上的 async}

不要让 await 语句参与运算:

// Bad:someArray.push(awaitsomeFunction());
constsomeObj= {
result: awaitsomeFunction()
};
// Good:constresult=awaitsomeFunction();
someArray.push(result);
constresult=awaitsomeFunction();
constsomeObj= {
result};

使用 RxJS 封装底层方法

学习教程: http://rx.js.cool/

贡献仓库: https://github.com/willin/rx.js.cool

适用场景介绍

前端组件

  • 如绑定鼠标移动事件并进行计算和处理
  • 如绑定鼠标点击事件并设置最小触发间隔
  • 侦听屏幕滚动并且 debounce
  • 等等

示例:

需要可撤销的业务场景

参考: http://rx.js.cool/mixin/undo

流式处理(流程化的方法)

示例:

from(Promise.resolve([
// 模拟数据    { id: 1, name: 'Kitty1', age: 1, breed: 'string' },
    { id: 2, name: 'Kitty2', age: 1, breed: 'string' },
    { id: 3, name: 'Kitty3', age: 1, breed: 'string' },
    { id: 4, name: 'Kitty4', age: 2, breed: 'string' },
    { id: 5, name: 'Kitty5', age: 2, breed: 'string' },
    { id: 6, name: 'Kitty6', age: 2, breed: 'string2' }
  ])).pipe(
// 此处仅用于作为 rxjs 的操作示例// Filter by AgemergeMap((cats: Cat[]) =>iif(
//        () =>age>=0,
// Query 里的数值类型,如果没有默认值,实际为字符串类型of(cats.filter((cat) =>`${cat.age}`===`${age}`)),
of(cats)
      )
    ),
// Filter by NamemergeMap((cats: Cat[]) =>iif(
//        () =>name!=='',
of(cats.filter((cat) =>cat.name===name)),
of(cats)
      )
    ),
// Filter by BreedmergeMap((cats: Cat[]) =>iif(
//        () =>breed!=='',
of(cats.filter((cat) =>cat.breed===breed)),
of(cats)
      )
    ),
// PaginationmergeMap((cats: Cat[]) =>of(cats.slice(offset, offset+limit)))
  );

Promise 方法改写

给出几种示例,更多需要自行摸索:

// 示例1:import { from } from'rxjs';
// getPromise() is called once, the promise is passed to the Observableconstobservable$=from(getPromise());
// 示例2:import { defer } from'rxjs';
// getPromise() is called every time someone subscribes to the observable$constobservable$=defer(() =>getPromise());


相关文章
|
2月前
好的编程习惯
好的编程习惯
35 0
|
2月前
|
JavaScript 前端开发
|
7月前
|
设计模式 人工智能 Java
一个可读性高的代码对程序员有多重要
人们都以为编写任何程序员都能够阅读和理解的代码是软件开发人员的固有技能。事实上只有20%的程序员具备这种能力。
|
9月前
|
C# uml
代码优化总结
代码优化总结
|
SQL 缓存 druid
代码优化(一)
不知道你有没有拼接过字符串,特别是那种有多个参数,字符串比较长的情况。 比如现在有个需求:要用get请求调用第三方接口,url后需要拼接多个参数。 以前我们的请求地址是这样拼接的:
105 0
|
存储 算法 编译器
C++代码优化
列举了游戏服务器开发过程中应当注意的一些规范,以保证我们服务器代码具有更高的可读性、可维护性以及更高的稳定性和运行效率。
92 0
DHL
|
算法 Java 编译器
容易被忽视的几个 Kotlin 细节, value class 执行效率竟然这么高
今天这篇文章主要介绍 value class 和 data class 的区别,这可能是平时在做业务开发的时候,容易被忽视的几个细节。通过这篇文章,你将学习到以下内容。
DHL
384 0
容易被忽视的几个 Kotlin 细节, value class 执行效率竟然这么高
|
存储 算法 前端开发
Proxyee代码阅读
本篇文章主要讲述了对开源项目proxyee的代码阅读
|
前端开发 数据安全/隐私保护 Windows
如何做到每天比别人少写200行代码?
大家好,我是冰河~~ 这次我把工作中总结的经常使用的正则表达式共享出来了,正是掌握了这些正则表达式,冰河平均每天比别人少写200行代码,极大的提高了研发效率,建议小伙伴们收藏,平时尝试着使用到自己的项目中!!
|
Java 关系型数据库 C#

热门文章

最新文章