Ecmascript-6
ES6 发布时间2015-6月,又称ECMAScript 2015
http://kangax.github.io/compat-table/es6/
基本概念
-
同步:连续的执行;当前任务没完成时,其他任务不能插入执行,只能等待上一个任务执行完成才能开始执行
-
异步:简单说就是将一个任务分为两段,先执行一段,然后转而执行其他任务,等做好了准备之后,再回过来执行第二段
-
回调函数: 把任务的第二段单独写在一个函数里,等待重新执行这个任务的时候,直接调用这个函数,就是回调; 英文Callbcack
回调出现多重嵌套的时候,会导致代码不是纵向发展而是横向发展,很快代码就乱成一团,不易管理
代码如下
fs.readFile(fileA, function(err, data){
...
fs.readFile(fileB, function(err, data){
...
fs.readFile(fileC, function(err, data){
...
会出现地狱回调 callback hell
})
});
})
- promise 就是为了解决以上问题而提出的
readFile(fileA).then(function(data){
console.info(11);
}).then(function(){
return readFile(fileB);
}).then(function(data){
console.info();
})....
Generator
协程(coroutine)
多个任务相互协作,完成异步任务
协程遇到yield命令就暂停,等到执行权返回,再从暂停的地方继续往后执行。它的最大优点,就是代码的写法非常想同步操作。
去除掉yield命令,简直就是一模一样
function *asnycJob() {
//...logical code
var f = yield readFile(fileA);
//...logical code
}
Generator函数
最大的特点就是可以交出函数的执行权(即暂停执行)
function* gen(x) {
var y = yield x+2;
return y;
}
var g = gen(2);
console.info(g.next());// {value: 4, done: false}
console.info(g.next()); // {value: undefined, done: true}
Thunk函数
var x = 1;
function add1(y) {
var result = 1+y;
}
add1(x+10);
//传值调用 (10+1)->y=11 ; result = 1+ 11 =12
//传名调用 (x+10)-y; result= 1+ (x+10) -? 1+(1+10) = 12
thunk函数即编译器的‘传名调用’的实现; 往往是将参数放入一个临时函数;再讲函数传入函数体
function add1(y) {
var result = 1+y;
var result2 = 10 + y*1;
}
add1(x+10);
=>
function thunk() {
return x+10;
}
function add1(thunk){
var result = 1+ thunk() ;
var result2 = 10 + thunk() *1;
}
javascript thunk函数转换器
var Thunk = function(fn) {
return function() {
var args = Array.prototype.slice.call(arguments);
return function(callback){
args.push(callback);
return fn.apply(this, args);
}
}
}
var readFileThunk = Thunk( fs.readFile );
readFileThunk(fileA)(callback);
Thunkify模块
生产环境的转换器,建议使用Thunkify模块
使用方式如下
var thunkify = reuqire('thunkify');
var fs = require('fs');
var read = thunkify(fs.readFile);
read('xxx')(function(err, str)){
//...
}
co模块
- co模块是TJ Holowaychuk于2013年6月发布的一个小工具,用于Generator函数的自动执行
var gen = function*(){
var f1 = yield readFile('/etc/fstab');
var f2 = yield readFile('/etc/shells');
console.info(f1.toString());
console.info(f2.toString());
}
async函数
async函数就是Generator函数的语法糖
Generator
function* foo() {
var result = yeild readFile('1');
var result1= yeild readFile('2');
console.info(result1);
}
async
async function foo() {
var result = await readFile('1');
var result1= await readFile('2');
console.info(result1);
}