私はどのように学習しているのですかngZoneはで動作します。角度はです。 標準の非同期操作(setTimeoutなど)のサルのパッチ適用がわかっています。ngZoneまたはzone.js:猿のパッチの場所?
しかし、誰が猿のパッチを当てていますか? zone.jsライブラリまたはngZone内のAngular自体? ソースコード内で特定の場所を表示できるのは素晴らしいことです。
私はどのように学習しているのですかngZoneはで動作します。角度はです。 標準の非同期操作(setTimeoutなど)のサルのパッチ適用がわかっています。ngZoneまたはzone.js:猿のパッチの場所?
しかし、誰が猿のパッチを当てていますか? zone.jsライブラリまたはngZone内のAngular自体? ソースコード内で特定の場所を表示できるのは素晴らしいことです。
Angularはzone.js内のゾーンを実行し、zone.jsはパッチされたAPIをスコープとして提供します。
自分でzone.run(...)
をAngularのものなしで使用して、パッチ適用されたAPIのすべての効果を得ることができます。
も参照してくださいhttps://github.com/angular/zone.js/
ゾーンライブラリは、ブラウザとサーバー側のプロジェクトの両方で動作するように持っているタイマー https://github.com/angular/zone.js/blob/master/lib/common/timers.ts#L22
をパッチコード。ですから、単にグローバル関数にパッチを当てるよりも少し複雑です。
ゾーンは、グローバルAPIにパッチを当てるだけでなく、ブロードキャストされるイベントオブジェクトにもパッチを適用します。パッチはZone.__load_patch
で実行され、これらのモジュールで何がパッチされているかを確認できます。
https://github.com/angular/zone.js/blob/master/lib/browser/browser.ts
https://github.com/angular/zone.js/blob/master/lib/node/node.ts
https://github.com/angular/zone.js/blob/master/lib/rxjs/rxjs.ts
それは明らかに単純なプロセスではないのです。ゾーンにパッチが適用されていないエッジケースがまだあると確信しています。
だからsetTimeoutOriginal!== setTimeout? zone.jsの特定の場所が見つかりませんでした。私に回線を提供できますか? –
@StepanSuvorovゾーンがロードされた後は元のメソッドを取得できません。それは私がオリジナルを手に入れるためのAPIを見たことがないので、ゾーンの内部にあるだろう。 – cgTag
@StepanSuvorov私の更新された答えを見てください。 –