
在做前端浏览器信息追踪,把所有获取信息的方法和 method 都放在了一个 object 里 但是有些浏览器默认阻止了一些行为导致执行中断,
有没有什么办法能够在异常处理里面执行完一个 object 的所有 method 。。。
举例:
traceinfo=new Object(); traceinfo.timezOne=new Date().getTimezoneOffset(); traceinfo.hardwareCOncurrency=navigator.hardwareConcurrency; //cpu logical 核心数 traceinfo.timezone_extend=Intl.DateTimeFormat().resolvedOptions().timeZone; //有些浏览器不支持 traceinfo.is_private_window=is_private_window(); traceinfo.os_info=getos_info(); traceinfo.os_info_extend=navigator.oscpu; traceinfo 这个 object 里面既有 method 也有直接的浏览器变量赋值,如果直接像上面这样运行,假设比如火狐浏览器阻止了 navigator.hardwareConcurrency 数据的获取,抛出了 navigator 未定义异常,会导致后面的 timezone_extend ,is_private_window ,os_info ,os_info_extend 都为空
期待是能够(伪 python):
for methodname in traceinfo: try: traceinfo.dataname=traceinfo.methodname() except: traceinfo.dataname=null 得到的结果会都在 traceinfo 对象里面,个别获取不到的就为空就好
method 实在比较多,一个个用 try catch 包裹感觉不优雅...
1 Puteulanus Mar 15, 2022 const arr = ['log','error','test','warn'] for (i in arr) { try { console[arr[i]](i) } catch (e) { console.log(e) } } 这样? |
2 rioshikelong121 Mar 15, 2022 借助一个函数把 = 后面的计算逻辑包裹在匿名函数里面传递过来? function wrap(fn, ...args){ try { return fn.apply(this, args); } catch (e) { return null } } |
3 BreadKiller Mar 15, 2022 forin 里 trycatch 就行了吧,和你写的那段伪 Python 差不多 for (const key in traceinfo) { if (Object.hasOwnProperty.call(traceinfo, key)) { const method = traceinfo[key]; if (typeof method === 'function') { try { traceinfo[key] = method(); } catch (error) { traceinfo[key] = null; } } } } |