Добавление домена в другой домен не работает в nodejs - PullRequest
0 голосов
/ 09 ноября 2018

в 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?

...