V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
RatioPattern
V2EX  ›  问与答

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

  •  
  •   RatioPattern · 2022-03-15 18:42:11 +08:00 · 973 次点击
    这是一个创建于 991 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在做前端浏览器信息追踪,把所有获取信息的方法和 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 条附言  ·  2022-03-16 23:21:31 +08:00
    感谢,采用了 BreadKiller 大牛给的方法改造了很理想
    3 条回复    2022-03-15 23:17:25 +08:00
    Puteulanus
        1
    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
        2
    rioshikelong121  
       2022-03-15 23:02:22 +08:00   ❤️ 1
    借助一个函数把 = 后面的计算逻辑包裹在匿名函数里面传递过来?


    function wrap(fn, ...args){
    try {
    return fn.apply(this, args);
    } catch (e) {
    return null
    }
    }
    BreadKiller
        3
    BreadKiller  
       2022-03-15 23:17:25 +08:00   ❤️ 1
    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;
    }
    }
    }
    }
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2608 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 10:38 · PVG 18:38 · LAX 02:38 · JFK 05:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.