js 有什么办法执行一个 object 的所有 method 并带上异常处理?

2022-03-15 18:42:11 +08:00
 RatioPattern

在做前端浏览器信息追踪,把所有获取信息的方法和 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 包裹感觉不优雅...

964 次点击
所在节点    问与答
3 条回复
Puteulanus
2022-03-15 19:55:30 +08:00
const arr = ['log','error','test','warn']

for (i in arr) {
try {
console[arr[i]](i)
} catch (e) {
console.log(e)
}
}

这样?
rioshikelong121
2022-03-15 23:02:22 +08:00
借助一个函数把 = 后面的计算逻辑包裹在匿名函数里面传递过来?


function wrap(fn, ...args){
try {
return fn.apply(this, args);
} catch (e) {
return null
}
}
BreadKiller
2022-03-15 23:17:25 +08:00
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;
}
}
}
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/840565

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX