Я экспериментирую с зонами (zone.js), и я понял, что не знаю, какой лучший способ распечатать все зоны от корня до текущей зоны, в которой была ошибка.
Например, этот код использует два вложенных обратных вызова с setTimeout()
, а затем вызывает функцию с именем failedFunc()
, которая вызывает ошибку:
require('zone.js');
function failedFunc() {
throw new Error("it broken");
}
let rootZone = Zone.current;
function func1() {
let zoneA = rootZone.fork({name: 'zoneA'});
zoneA.run(() => {
setTimeout(() => func2());
});
}
function func2() {
let zoneB = Zone.current.fork({name: 'zoneB'});
zoneB.run(() => {
setTimeout(() => failedFunc());
});
}
func1();
Когда я запускаю этот пример, он дает следующий вывод:
/.../zone-test/node_modules/zone.js/dist/zone-node.js:170
throw error;
^
Error: it broken
at new Error (native)
at failedFunc (/.../zone-test/zone_02.js:12:9) [zoneB]
at Timeout.setTimeout (/.../zone-test/zone_02.js:28:22) [zoneB]
at Zone.runTask (/.../zone-test/node_modules/zone.js/dist/zone-node.js:166:47) [<root> => zoneB]
at Timeout.ZoneTask.invoke (/.../zone-test/node_modules/zone.js/dist/zone-node.js:416:38) [<root>]
at Timeout.data.args.(anonymous function) [as _onTimeout] (/.../zone-test/node_modules/zone.js/dist/zone-node.js:1590:25) [<root>]
at ontimeout (timers.js:365:14) [<root>]
at tryOnTimeout (timers.js:237:5) [<root>]
at Timer.listOnTimeout (timers.js:207:5) [<root>]
Правильный путь для зоны, которая выбрасывает ошибку, <root>
= > zoneA
= > zoneB
.
Однако это не очевидно из результата. Там просто [root]
и zoneB
, и он не упоминает zoneA
, который запутывает. Я думаю, это связано с тем, что патч zone.js
monkey добавляет информацию о зоне в строки в стеке вызовов. Поэтому, когда я использую setTimeout()
, чем создание zoneA
не соответствует какой-либо строке на выходе, и поэтому я не вижу его нигде.
Тем не менее, я могу распечатать путь к текущей зоне, итерации всех его родителей, но это означает, что мне нужно знать, где произошла ошибка, и добавить к нему следующий код (что было бы очень утомительно на практике):
function failedFunc() {
let zone = Zone.current;
let zones = [];
while (zone) {
zones.push(zone.name);
zone = zone.parent;
}
console.log(zones);
throw new Error("it broken");
}
// ...
Теперь, когда я запустил это, я получу то, что мне нужно:
[ 'zoneB', 'zoneA', '<root>' ]
/.../zone-test/node_modules/zone.js/dist/zone-node.js:170
throw error;
^
Error: it broken
at new Error (native)
Итак, мне интересно, как использовать zone.js на практике и таким образом, чтобы это было проще, чем это.