造了套自己的 Promise

Promise 很火,没看源码,仅参考平时的使用,造了一个小轮子(有时间再去看源码把)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class PromiseT {
constructor() {
this.status = 'running';
this.val = null;
this.pendingList = [];
}
then(...list) {
this.pendingList.push(...list);
return this.run();
}
resolve(val) {
this.status = 'running';
if (val !== undefined) {
this.val = val;
}
return this.run();
}
pending() {
this.status = 'pending';
}
run() {
if (this.status === 'pending') {
return this;
}
const cal = this.pendingList.shift();
if (cal === undefined) {
return this;
}
const result = cal(this.val, this);
if (result === undefined) {
return this.run();
}
if (result.constructor === PromiseT) {
return result.then(...this.pendingList);
}
this.val = result;
return this.run();
}
}

测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
new PromiseT()
.resolve(5)
.then(x => x + 1)
.then(x => new PromiseT().resolve(2).then(a => x / a))
.then(x => console.log(x))
.then((x, p) => {
p.pending();
setTimeout(() => {
p.resolve(x - 3);
}, 2000);
})
.then(x => console.log(x));

// 输出 3
// 等待 2s
// 输出 0

毕竟是小轮子,catch() finally() 这些没写。。。

发布 npm 包到 GitHub Packages

GitHub Packages在半年前尝试过,那时候存在些问题

  1. 不能使用yarn安装(这个已经修复了)
  2. 必须认证授权才能使用,即便你的包是开源的,很不方便

但不管怎样,GitHub Packages始终是个不错的备选方案

JUnit 5 教程

JUnit 5 作为新一代的 Java 单元测试框架,提供很多改进。例如对比 JUnit4JUnit5 的官网,JUnit5 的设计更加简约与时尚,至少不会抗拒阅读的程度了(像破烂一样的网站,看了整个人都难受,不影响效率?不存在的)

而且,除此外,他的文档使用了 Asciidoc, 相对于markdown复杂,主要是它还支持具有包含另一个文件内容,这对于写API文档来说挺重要的,有兴趣可以了解下~

Okay, 结束吐槽,让我来看看 JUnit5 到底带来了哪些变化吧

Intersection Observer 简介

Intersection Observer API提供了一种异步观察目标元素与祖先元素或顶级文档viewport的交集中的变化的方法。这使得以往较难实现的功能,更加简单,例如,监听图片元素,在适当的时候懒加载图片。

探究:优惠券的设计

最近几天,和朋友讨论了许多优惠券相关的问题,他以产品的角度,探究优惠券的意义场景等。他阐释,优惠券的本质是价格歧视,通过对不同消费者提供不同的收费标准,以此来增加营收。

当然,从我的角度出发(程序猿),我并不关心优惠券的目的,而更感兴趣于架构的设计,毕竟这块很有挑战性。比如满减或者折扣等涉及支付系统,用户领取使用又涉及用户系统等等(这里假设在微服务架构下)通常优惠券会影响多个系统,除此外,优惠规则与限制条件又十分复杂。但越难才越有意思。

我初步将优惠券系统分为以下四个部分:

  • 优惠券主体,简单说定义名称或者一些说明之类
  • 优惠策略,定义处理优惠的方式
  • 限制规则,在这部分中定义什么条件下可使用或者“过期”
  • 发放策略,定义何时如何发放,一般情况下与用户和活动系统相关

为了实现一个我理想中的优惠券系统

  • 支持多张券同时使用
  • 支持各种限制,甚至自定义限制
  • 尽可能的降低各个系统与优惠券系统的耦合性

npm 免密 publish

做个笔记,毕竟多台电脑,需要配置

  1. 创建token

  1. 添加.npmrc文件至用户目录下
    1
    2
    //npm.pkg.github.com/:_authToken=*****************
    //registry.npmjs.org/:_authToken=*****************

一个简单的retrofit工具类

使用

1
2
3
4
5
6
// 同步返回Optional<T>
var repos = RetrofitUtils.execute(service.listRepos("octocat")).orElse(new ArrayList<>());
// 异步
RetrofitUtils.execute(service.listRepos("octocat"), repos -> {
//业务逻辑
});

Hexo Netlify CMS 1.0

Hexo Netlify CMS隔了好久终于迎来了一次大更新(不兼容),主要有以下的更新内容

  1. 扩展fields,在原本的Netlify CMS中,fields的设置比较麻烦,这次独立出global_fields方便配置
  2. 新增auto_generator用于管理postpage的生成,支持多个post配置
  3. 默认配置优化,环境搭好(Netlify启用相应服务)后,不需要额外配置便能使用Netlify CMS
  4. 调试优化,--debug一键修改Netlify CMS授权模式为test-repo,可直接调试

详细的文档见GitHub的Readme