函数式编程:
一个函数,一定要纯,纯洁。不能对外部有依赖,也不能改变外部的值。否则不可控。函数最好都是单个参数。
从结构化过程式编程到定义过程编程
定义一个纯净的容器
class Container {
constructor (val) {
this.val = val;
}
}
构建一个加1的函数
function addOne(val) {
return val + 1 ;
}
初始化一个容器 然后把值给到+1 函数处理, 得到的结果再初始化一个新的容器对象
完成上述需要下面三步
var obj = new Container(1);
var val = addOne(obj.val);//2
var obj2 = new Container(val);//obj.val = 2
console.log(obj.val,obj2.val);
// 把容器对象obj的内的值进行计算并得到一个新的容器对象,有两件事情可以简化。
// 1. 预先定制好生成新值的函数。注意:具体讲是预先定制好调用生成新值的函数。具体的实现细节由调用者自己决定。
// 2. 封装生产新容器的操作
class Container {
constructor(val) {
this.val = val;
}
// map 定义一个map 映射函数 把自己的值传递给传进来的函数 其结果作为新容器的参数,返回一个新容器
map(f) {
return new Container(f(this.val));
}
}
创建一个有值的新对象
var obj = new Container('JS');//obj.val = 'JS'
通过map函数创建新函数
var obj2 = obj.map(function (val) {
return 'hello, ' + val;
});//obj2.val = 'hello, JS'
obj2 也有map函数,可以把自己的值一直传递下去
var obj3 = obj2.map(function (val) {
return val + ', how are u!';
});//obj3.val = 'hello, JS, how are u!'
那么上面的可以用链条方式来书写
var obj = new Container("JS");
obj.map(function (val) {
return 'hello, ' + val;
})
.map(function (val) {
return val + '. how are u!'
})
.map(function (val) {
console.log(val);
});
假如把map函数换成then。那么链条就是这样的
var obj = new Functor('JS');
obj
.then(function(val) {
return 'hello, ' + val;
})
.then(function(val) {
return val + '. how are u!';
})
.then(function(val) {
console.log(val); // hello, JS. how are u!
})
满足链式写法的一个核心就是:调用的一个then函数或者map函数返回的都是一个对象,该对象也具有then或者map方法。
Promise运用
Promise的链式写法就是这个道理,Promise在某种情况下,就是一种容器。
var promise = new Promise(function(resolve, reject) {
....
});
var promise2 = promise.then(); // 返回一个新的 promise 对象
var promise3 = promise2.then(); // 返回一个新的 promise 对象
所以可以简写成
var promise = new Promise(function(resolve, reject) {
....
});
promise.then().then().then().then().then()
Promise的牛逼之处,是定义函数时不用再定义一层层的回调函数,Promise处理的很好。如何没有回调呢?因为Promise对象,定义时,默认要传入一个函数,resolve和reject,没问题就调用resolve,有问题就调用reject。没有回调,如何处理结果。使用另一个机制处理结果和错误,那就是 then 和 catch。
参考链接: