Ich versuche, Kontext über den Async-Stack mit Knoten async_hooks zu verfolgen. Es funktioniert in den meisten Fällen jedoch habe ich diesen Anwendungsfall gefunden, dass ich nicht denken kann, wie zu beheben:Tracking-Kontext mit async_hooks
service.js:
const asyncHooks = require('async_hooks');
class Service {
constructor() {
this.store = {};
this.hooks = asyncHooks.createHook({
init: (asyncId, type, triggerAsyncId) => {
if (this.store[triggerAsyncId]) {
this.store[asyncId] = this.store[triggerAsyncId];
}
},
destroy: (asyncId) => {
delete this.store[asyncId];
},
});
this.enable();
}
async run(fn) {
this.store[asyncHooks.executionAsyncId()] = {};
await fn();
}
set(key, value) {
this.store[asyncHooks.executionAsyncId()][key] = value;
}
get(key) {
const state = this.store[asyncHooks.executionAsyncId()];
if (state) {
return state[key];
} else {
return null;
}
}
enable() {
this.hooks.enable();
}
disable() {
this.hooks.disable();
}
}
module.exports = Service;
service.spec.js
const assert = require('assert');
const Service = require('./service');
describe('Service',() => {
let service;
afterEach(() => {
service.disable();
});
it('can handle promises created out of the execution stack', async() => {
service = new Service();
const p = Promise.resolve();
await service.run(async() => {
service.set('foo');
await p.then(() => {
assert.strictEqual('foo', service.get());
});
});
});
});
Dieser Testfall schlägt fehl, da die triggerAsyncId des beim Aufruf von next
erstellten Versprechens die executionAsyncId des Promise.resolve() - Aufrufs ist. Das wurde außerhalb des aktuellen asynchronen Stapels erstellt und ist ein separater Kontext. Ich kann sehen, keiner Weise die next
Funktionen async Zusammenhang mit dem Kontext zu heiraten es erstellt wurde.
https://github.com/domarmstrong/async_hook_then_example
https://github.com/nodejs/help/issues/1036 Ein Problem bei Node help Repo wurde erstellt. – DomA