thunkify

引子

自己之前曾经撸过一个验证库,代码大致如下:

function validate(data, rules, cb) {
// ....
// 一切完成后会触发回调函数
cb(null, errMap);
}

出于性能上的考虑,该库被封装为了一个异步函数,需要提供一个回调函数 cb 来获得验证结果,该回调函数是一个满足 node 规范的 error-first callback。在其他系统中,该库使用良好,但是,新项目使用了 koa,我在中间件中使用这个库提供的 validate 方法, 却连编译期都没有通过:

使用 ES6 中的 generator 来优化异步过程

原文:Going Async With ES6 Generators
本文在作者文章的基础上,适当补充了一些代码及说明

ES6 中的 generator 能够帮助我们提供一种类似同步一样的代码风格,来将异步过程的具体实现隐藏。这样的好处就是我们能够更加自然的表达自己的业务流程(work flow),而避免陷入异步的麻烦中。换言之,借助于 generator,我们既拥有了异步执行的能力,又不用再绞尽脑汁的去维护异步代码。

继续阅读本文,你会发现这么做的结果简直太美妙了,以前那些糟糕的异步代码现在讲会想同步代码那样变得 易于阅读 可维护 。需要知道的是,这个同步只是代码风格上的同步,他的执行过程仍然是异步的。

说了那么多,仍然有些抽象,现在我们由浅入深地看看到底怎么通过 ES6 来优化异步过程。

JavaScript 中的递归优化

引子

说到递归,我们先来看一个最常见的递归用例: 计算阶乘

function factorial(n) {
if(n==1) return 1;
return n*factorial(n-1);
}

测试一下:

factorial(5); // => 120

似乎一切正常,5 的阶乘 120 被正确计算出来了,我们试着把数字调大一些:

factorial(70000);
// Uncaught RangeError:Maximum call stack size exceeded(…)

浏览器提示我们 栈溢出 了(测试环境:chrome 51),究竟发生了什么呢?

Redux 中间件的实现

引子

我们知道在 Redux 中,dispatch 的作用在于派发一个 action,该 action 会被 reducer 收到,reducer 根据 action 的类型进行相应的状态(state)维护:



Flux 下的组件化开发

Flux 构成

首先要明确的是,Flux 并不是一个前端框架,而是前端的一个设计模式,一个状态管理机制,其把前端的一个交互流程简单的模拟成了一个单向数据流。



在上图中,我们可以看到 Flux 的四个核心构成:

深入理解 throttle 与 debounce

我们先来看一个前端开发中遇到的场景:

在页面中,我们有一个 “查询” 按钮,单击该按钮,会通过 ajax 异步查询一些数据

假设这个查询是耗时的,并且会给后端造成一定压力,那么如果短时间内我们频繁点击该按钮,请求就会不断发出,这样给后端造成的压力是难以想象的。因此,我们会想到控制我们的查询速率。

利用 Sails.js + MongoDB 开发博客系统(4)-- 文章模块

章节概述

在本章中,你将能学习到如下知识:

  • 认识 MongoDB 的 mapReduce 函数,并利用其实现标签统计功能。
  • 认识 ES6 中的 Promise,了解其实现库 blue bird,为我们解决 Node 中难看的嵌套回调。
  • 如何利用 markdown 来创建文章并完成代码高亮显示。