☻Blog("Laziji")

System.out.print("辣子鸡的博客");

在js中需要将异步方法同步的时候, 经常使用的是asyncawait, 或者用Promise

偶然在dvajs中看到其使用yield迭代器实现了同步的效果, 例如

1
2
3
4
5
6
7
8
9
10
11
function* f(){
var a = Promise.resolve(1);
console.log(a); // Promise
var ra = yield a;
console.log(ra); // 1
var b = Promise.resolve(2);
console.log(b); // Promise
var rb = yield b;
console.log(rb); // 2
return "success";
}

当然直接运行不能得到预期的效果, Promise没用同步执行, yield返回的结果也是undefined, 因为还缺少对其的一层封装, 或者说还缺少个执行器

1
2
3
4
var it = f();
it.next();
it.next();
it.next();

传统的迭代器, 是这样使用的

1
2
3
4
5
6
7
8
9
function* range(){
for(let i=0;i<n;i++){
yield i;
}
}
var it = range();
console.log(it.next().value); // 0
console.log(it.next().value); // 1
console.log(it.next().value); // 2

如下封装, 在每一次yield返回的Promisethen中进行下一次迭代, 并把结果传入 g.next(r), 迭代函数的next(r)中的参数r会成为函数体中yield标识的表达式的返回值, 从而达到类似await的效果

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
function async(g) {
var ctx = this;
return new Promise(function(resolve, reject) {
g = g.apply(ctx);
next();
function next(r) {
var result = g.next(r);
if (result.done){
return resolve(result.value);
}
result.value.then(next);
}
});
}

async(function*(){
var a = Promise.resolve(1);
console.log(a); // Promise
var ra = yield a;
console.log(ra); // 1
var b = Promise.resolve(2);
console.log(b); // Promise
var rb = yield b;
console.log(rb); // 2
return "success";
}).then(v=>{
console.log(v) // success
});

当本地搭建gitlab服务器的时候经常使用的是直接ip访问, 没有域名, 所以无法访问到类似*.gitlab.io的Pages

这里提供一个取巧的解决办法, 因为gitlab仓库下的文件都可以通过/raw访问原始文本文件, 响应返回类型是文本

所以只需要通过Nginx把后缀为html的文件返回类型改为text/html, 图片类型的改为image/png即可直接访问到网页了

gitlab方面无需配置, Nginx加入如下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 8080;
server_name gitlab;
location / {
proxy_pass http://127.0.0.1/;
add_header content-type "text/html; charset=utf-8";
if ($request_uri ~* "/[^/]+/[^/]+/raw/[^/]+/.+\.svg") {
add_header content-type 'image/svg+xml';
}
if ($request_uri ~* "/[^/]+/[^/]+/raw/[^/]+/.+\.png") {
add_header content-type 'image/png';
}
if ($request_uri ~* "/[^/]+/[^/]+/raw/[^/]+/.+\.(jpeg|jpg|icon)") {
add_header content-type 'image/jpeg';
}
}
}

配置之后例如用户LLL有个仓库blog的主分支master上存放着类似hexo搭建的博客文件,
只需要访问http://127.0.0.1:8080/LLL/blog/raw/master/index.html即可进入博客了

0%