Angular应用里setTimeout被如何被monkey patched的

原创
2021/02/17 11:47
阅读数 122

monkey patched: monkey patch指的是在运行时动态替换,一般是在startup的时候.

下面的测试代码可以让我们弄清楚,浏览器支持的原生函数setTimeout,是如何在Angular应用启动时被monkey patched的:

将setTimeout保存到一个Angular变量里。

在zone-evergreen.js的patchMethod方法里:

下图地2719行,能看到timers组下面的setTimeout,setInterval被monkey patched的入口:

Zone.__load_patch('timers', (global) => {
   
   
   
        const set = 'set';
        const clear = 'clear';
        patchTimer(global, set, clear, 'Timeout');
        patchTimer(global, set, clear, 'Interval');
        patchTimer(global, set, clear, 'Immediate');
    });
    Zone.__load_patch('requestAnimationFrame', (global) => {
   
   
   
        patchTimer(global, 'request', 'cancel', 'AnimationFrame');
        patchTimer(global, 'mozRequest', 'mozCancel', 'AnimationFrame');
        patchTimer(global, 'webkitRequest', 'webkitCancel', 'AnimationFrame');
    });
    Zone.__load_patch('blocking', (global, Zone) => {
   
   
   
        const blockingMethods = ['alert', 'prompt', 'confirm'];
        for (let i = 0; i < blockingMethods.length; i++) {
   
   
   
            const name = blockingMethods[i];
            patchMethod(global, name, (delegate, symbol, name) => {
   
   
   
                return function (s, args) {
   
   
   
                    return Zone.current.run(delegate, global, args, name);
                };
            });
        }
    });

然后我在Angular应用里调用setTimeout时,执行的实际上是被monkey patched之后的版本,即代码1449行的函数体 patchDelegate, 一个委托函数:

更多Jerry的原创文章,尽在:“汪子熙”:

本文同步分享在 博客“汪子熙”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部