函数式编程
函数式编程是把数学中的函数套用到程序中来。这样数学中关于函数的种种性质就都可以用到程序里面。但是实际使用中的程序很难达到
数学函数的要求。所以这样的变成方式价值不是很大。
考虑到函数式编程的优点 突出处理的过程,取消不必要的变量和函数定义
为什么不把条件给放宽呢?即使不满足函数这个条件也可以做函数式的编程。
比如我写的这个函数
#在这里输入代码(从下一行开始,不要删除我...)
/*
* 减少网络请求量,如果同一个函数被同样的调用了很多次,那么就把最近调用的结果返回,不再执行这个函数。
* 例子
* any(API.getUserInfo)(email).then({
* // do something here
* })
* any(API.getUserInfo)(email).then({
* // do something there
* })
* 实际执行的时候只会请求一次数据,一旦其中一个请求到数据,另外一个也会得到结果
*/
var handlerMaps = new Map();
var argumentsRecords = [];
function any(handler, updateInterval) {
var updateInterval = updateInterval || 5000;
var handlerParamMaps = handlerMaps.get(handler);
if (typeof handlerParamMaps == "undefined") {
handlerParamMaps = new Map();
handlerMaps.set(handler, handlerParamMaps);
}
return function () {
var mparams = arguments;
var recordUuid = "";
_(argumentsRecords).each(function (record) {
if (_(mparams).isEqual(record.params)) {
recordUuid = record.uuid;
}
})
var res = handlerParamMaps.get(recordUuid);
if (typeof res == "undefined" || Date.now() - res.time > updateInterval) {
// first time call
res = {
'promise': handler.apply({}, mparams),
'time': Date.now(),
'reqQueue': [],
};
if (recordUuid == "")
recordUuid = uuid();
handlerParamMaps.set(recordUuid, res);
argumentsRecords.push({
'uuid': recordUuid,
'params': mparams,
})
}
return res.promise;
}
}
输入的是一个函数,输出的也是一个函数。这样只要通过这样的包装就能够把原来的函数增加上我们需要的新特性。这个和函数式
编程的功能基本是一致的,但是实际上这个并不是数学意义上的函数。这样的编程方式在实际中应该更有意义。