Проблема с асинхронным выходом из домена узла
Это возможно exit
домен асинхронно относительно того, когда это было entered
? Моя "стековая" ментальная модель доменов явно недостаточна, потому что я ожидал, что это удастся:
var Domain = require('domain');
var assert = require('assert');
var outerDomain = Domain.create();
outerDomain.name = 'outer';
outerDomain.run(function() {
var innerDomain = Domain.create();
innerDomain.name = 'inner';
innerDomain.enter();
setImmediate(function() {
assert.strictEqual(process.domain.name, 'inner');
process.domain.exit();
// This assertion is failing because process.domain is undefined!
assert.strictEqual(process.domain.name, 'outer');
});
});
Второе утверждение не выполняется, потому что нет активного домена, в то время как я ожидаю, что "внешний" домен будет активным.
Я был бы признателен за понимание того, почему это не удается.
1 ответ
Хорошо, я думаю, что подкрепил свою ментальную модель работы доменов:
Когда я звоню setImmediate
анонимная функция привязана только к активному домену, без знания всего "стека" домена.
Поэтому, когда вы пересекаете асинхронный разрыв, "стек" домена теряется, и остается только активный домен.