简介
主要记录一些常用的函数,方便后续使用
链式调用
compose
函数的异步版本,适合拦截器编写,前一个Promise
的返回值作为下一个Promise
的参数.
export const chain = steps => {
return async startParam => {
let latestResult = startParam;
while(steps.length) {
const nextStep = steps.pop();
if(nextStep) {
latestResult = await nextStep(latestResult);
}
}
return latestResult;
};
};
判断Invalid Date
Invalid Date的
getTime
的值是NaN
.
/**
*
* @param {string|number|Date} date
*/
const isInvalidDate = date => {
return isNaN(new Date(date).getTime());
};
deep clone
weekMap
主要记录当前已经clone
的对象。防止循环引用引起的死循环。
const getClass = target => Object.prototype.toString.call(target).replace(/^\[object (\w+)\]$/, '$1')
let weakMap = null
function cloneDate(date) {
return new Date(date)
}
function cloneMap(map) {
return new Map(map)
}
function cloneSet(set) {
return new Set(set)
}
function cloneObject(obj) {
weakMap = weakMap || new WeakMap()
if (weakMap.get(obj)) {
return weakMap.get(obj)
}
const cobj = {}
weakMap.set(obj, cobj)
for(let k in obj) {
cobj[k] = clone(obj[k])
}
return obj
}
function cloneArray(arrs) {
return arrs.map(item => clone(item))
}
function clone(target) {
const cls = getClass(target)
switch (cls) {
case 'Map':
return cloneMap(target)
case 'Object':
return cloneObject(target)
case 'Set':
return cloneSet(target)
case 'Date':
return cloneDate(target)
case 'Array':
return cloneArray(target)
default:
return target
}
}
function deepClone(target) {
const res = clone(target)
weakMap = null
return res
}