Проблема с асинхронным выходом из домена узла

Это возможно 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анонимная функция привязана только к активному домену, без знания всего "стека" домена.

Поэтому, когда вы пересекаете асинхронный разрыв, "стек" домена теряется, и остается только активный домен.

Другие вопросы по тегам