const regExpSync = (str, pat, fn) => {
let loc = 0;
let res;
while((res = pat.exec(str.substring(loc)))){
const rtn = fn(res);
if(rtn) return rtn;
loc += res.length + res.index;
}
};
const regExpAsync = async (str, pat, fn) => {
let loc = 0;
let res;
while((res = pat.exec(str.substring(loc)))){
const rtn = await fn(res);
if(rtn) return rtn;
loc += res.length + res.index;
}
};
const testPat = new RegExp('[a-z]+');
const testStr = '------aa-----abc--------zz--------dd----------';
console.log('-');
regExpSync(testStr, testPat, ([str]) => { console.log(str); return false; });
console.log('-');
await regExpAsync(testStr, testPat, async ([str]) => { console.log(str); return false; });
console.log('-');
我有几乎相同的异步和同步代码.
这只是一个例子,实际上它是更复杂的逻辑,与正则表达式无关.
无论如何,两者都作为回调函数fn工作.
每当这一逻辑发生变化时,我都会修改这两个文件.
有什么 idea 可以把修改降到最低吗?
我试了一下,但不是很方便.
在这里,我们可以提高代码的重用性吗?
const regExp = (str, pat, fn) => {
if(fn.constructor.name == 'AsyncFunction') return (async () => {
let loc = 0;
let res;
while((res = pat.exec(str.substring(loc)))){
const rtn = await fn(res);
if(rtn) return rtn;
loc += res.length + res.index;
}
})();
else {
let loc = 0;
let res;
while((res = pat.exec(str.substring(loc)))){
const rtn = fn(res);
if(rtn) return rtn;
loc += res.length + res.index;
}
}
};