继续探索JS中的Iterator,兼谈与Observable的对比

前言

JavaScript 2015中引入了Generator Function(相关内容可以参考前作ES6 generator函数与co一瞥ES6 generator函数与co再一瞥),并且在加入了Symbol.iterator之后,使得构造拥有自定义迭代器的集合变得相当容易(可以参考前作在JavaScript中实现LINQ——一次“失败”的尝试)。

前几天在群里@徐叔提出了这样一个问题:

1
2
3
4
5
function* listen(element) {
element.addEventListener('click', function(e) {
// 这里怎么把e通过外面的listen给yield出去?
})
}

音锤思婷……

我理解,叔叔写listen的目的是为了把事件源抽象成一个“可以被遍历的集合”。

补几个2017年2-3月大作简评

补几个2017年2-3月大作简评,《仁王》、《地平线:零之曙光》、《尼尔:自动人形》。

仁王 地平线 尼尔
画面 8 10 8
流畅度 10 9 10
剧情叙事 8 9 10
场景 8 10 7
战斗 9 9 9
音乐音效 7 8 10
系统 10 8 8
容量 9 9 8
小游戏 - - -
细节 8 8 9
总评 8.6 8.9 8.8

备注:

  1. 仁王系统集大抄,丰富但不杂乱,抄得挺好。
  2. 仁王后期关卡质量下降,刷刷刷能玩多久取决于对极品装备以及秒杀BOSS有大热情。
  3. 地平线系统也抄,然而乏善可称,没什么缺点也没什么亮点,比如抄巫师3追踪这就可有可无。
  4. 尼尔的ACT战斗部分给11分都不为过,但弹幕游戏劣质且(中后期)占比过高,减分。
  5. 尼尔的伪开放世界场景突出一个傻大空,不知道做这么大干啥……
  6. 听说尼尔PS4画质很狗牙,于是我买了PC,然而PC画质也好不到哪去。

总的来说,仁王和尼尔各自有一些创新点,也有明显的短板,尤其是尼尔。反过来看地平线就是好莱坞大片,高工业水准保证它起点就很高,但要有创新就显得更难了。

三者都是绝对能值回票价的。

由于我没有NS,所以无法评价《塞尔达:荒野之息》了。由于我个人不感冒,也没有买《女神异闻录5》。不过从目前的风评看,这两者也都是神作级别的,肯定是差不了。

补几个2016年游戏的简评

补几个2016年游戏的简评,黑暗之魂3、极限竞速地平线3、看门狗2、最终幻想15、守望先锋,顺便把之前写过的神秘海域4和古墓丽影10也搬过来。

黑魂3 地平线3 看门狗2 FF15 神秘海域4 古墓丽影崛起 守望先锋
画面 9 10 9 9 10 10 9
流畅度 10 8 9 8 9 9 10
剧情叙事 8 - 8 6 10 8 -
场景 10 10 9 9 10 10 8
战斗 10 - 7 10 9 9 10
音乐音效 8 9 8 10 9 9 8
系统 9 9 9 8 9 9 9
容量 9 9 8 10 9 10 9
小游戏 - - 7 7 8 8 -
细节 9 9 8 9 10 9 9
总评 9.1 9.1 8.2 8.6 9.3 9.1 9

我的年度游戏: 神秘海域4:贼途末路

在JavaScript中实现LINQ——一次“失败”的尝试

这篇文章的起因是我在知乎上对JavaScript 函数式编程存在性能问题么?这个问题的回答。其实在这个问题之前挺久我就想做相关的尝试,但懒癌无药医,挖坑如山倒,填坑如抽丝。

废话不多说,走你。

C# 3.0引入了引以为豪的LINQ(Language INtergrated Query),可以用类函数式的方式操作集合(C#中的IEnumerable接口)。

在JS中,数组也有类似的filtermapreduce一类方法,但存在重复遍历问题,利用C#中LINQ的思路,给JS实现一套LINQ是否可行呢?

初窥 ASP.NET Core MVC

最近心血来潮,想搞一下ASP.NET Core,于是准备把练琴记录仪的服务端迁移到ASP.NET Core MVC上,不过遇到些小问题,记录一下。

Cordova中与In App Browser的通讯

为了把我的练琴记录仪改成多用户App,我需要做一个Weibo OAuth功能,因为练琴记录仪是Single Page App,我不愿意直接跳转到OAuth页面,那样会打断我的应用状态,于是我打算打开一个新窗口来完成OAuth。

这样一来,问题自然就转换为跨窗口通讯问题了。

窗口间通讯毫无疑问首选是window.postMessage,在cordova当中,原生window.open是不能用的,官方给的方案是使用cordova-plugin-inappbrowser插件所提供的cordova.InAppBrowser.open(url, target, options)来取代window.open,这两者基本上API差不多一致。

但是IAB插件所返回的对象并不是真正的window,它没有postMessage功能,并且在IAB所打开的页面中,也没有window.opener,于是只能另辟蹊径,找点不靠谱的挫方法来试试了。