2020-06-07 01:12:57 +02:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
const common = require('../common');
|
|
|
|
|
|
|
|
const assert = require('assert');
|
|
|
|
const { AsyncLocalStorage } = require('async_hooks');
|
|
|
|
|
|
|
|
// This test verifies that async local storage works with thenables
|
|
|
|
|
|
|
|
const store = new AsyncLocalStorage();
|
|
|
|
const data = Symbol('verifier');
|
|
|
|
|
|
|
|
const then = common.mustCall((cb) => {
|
|
|
|
assert.strictEqual(store.getStore(), data);
|
|
|
|
setImmediate(cb);
|
|
|
|
}, 4);
|
|
|
|
|
|
|
|
function thenable() {
|
|
|
|
return {
|
2022-11-21 18:43:47 +01:00
|
|
|
then,
|
2020-06-07 01:12:57 +02:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
// Await a thenable
|
|
|
|
store.run(data, async () => {
|
|
|
|
assert.strictEqual(store.getStore(), data);
|
|
|
|
await thenable();
|
|
|
|
assert.strictEqual(store.getStore(), data);
|
|
|
|
});
|
|
|
|
|
|
|
|
// Returning a thenable in an async function
|
|
|
|
store.run(data, async () => {
|
|
|
|
try {
|
|
|
|
assert.strictEqual(store.getStore(), data);
|
|
|
|
return thenable();
|
|
|
|
} finally {
|
|
|
|
assert.strictEqual(store.getStore(), data);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// Resolving a thenable
|
|
|
|
store.run(data, () => {
|
|
|
|
assert.strictEqual(store.getStore(), data);
|
|
|
|
Promise.resolve(thenable());
|
|
|
|
assert.strictEqual(store.getStore(), data);
|
|
|
|
});
|
|
|
|
|
|
|
|
// Returning a thenable in a then handler
|
|
|
|
store.run(data, () => {
|
|
|
|
assert.strictEqual(store.getStore(), data);
|
|
|
|
Promise.resolve().then(() => thenable());
|
|
|
|
assert.strictEqual(store.getStore(), data);
|
|
|
|
});
|