в nodejs v11: код ниже не ведет себя ожидаемо:
let domain = require('domain');
let d1 = domain.create();
let d2 = domain.create();
d1.on('error', (err) => {
console.log('caught by d1', err); // not run in this case
});
d1.add(d2);
let f = d2.bind(() => {
throw 'this is a test'
})
f();
И это фактический результат:
/test123.js:11
throw 'this is a test'
^
this is a test
Конечно, функция ошибки f
threw не направляется обработчику ошибок d1.
Но согласно документу Нодейса:
https://nodejs.org/dist/latest-v11.x/docs/api/domain.html#domain_domain_add_emitter
Явно добавляет эмиттер в домен. Если какой-либо обработчик событий, вызванный эмиттером, генерирует ошибку, или если эмиттер генерирует событие error, он будет перенаправлен в событие error домена, как с неявным связыванием.
Когда мы запустим d1.add(d2)
, затем привязать f к d2 и запустить f. Тогда d2 выдаст событие ошибки, которое должно быть перенаправлено в обработчик ошибок d1, потому что собственный обработчик ошибок d2 еще не определен.
И ниже демо встретить мое понимание:
let domain = require('domain');
let d1 = domain.create();
let d2 = domain.create();
d1.on('error', (err) => {
console.log('caught by d1', err); //run in this case
});
d1.add(d2);
d2.emit('error', 123);
и вывод:
узел test123.js
пойман d1 123
Видимо, d1 перехватил событие ошибки d2.
Итак, мой вопрос:
В чем разница между:
Почему домен d1 не может перехватить событие ошибки d2, вызванное ошибкой, вызванной функцией, связанной с доменом d2?