I want something like thread-local storage in threaded programming and async_hooks is usable in node.js 8.0, so there is an easy way to use thread-local.
const als = require('async-local-storage');
als.enable();
setTimeout(() => {
const id = randomBytes(8);
als.set('id', id);
delay().then(() => {
assert.equal(als.get('id'), id);
return readfilePromise(__filename);
}).then(() => {
assert.equal(als.get('id'), id);
return superagent.get('http://www.baidu.com/');
}).then(() => {
assert.equal(als.get('id'), id);
});
}, 100);enable the async hooks
const als = require('async-local-storage');
als.enable();disable the async hooks
const als = require('async-local-storage');
als.enable();
setTimeout(() => {
als.disable();
}, 100);get the size of storage
const als = require('async-local-storage');
als.enable();
setTimeout(() => {
console.info(als.size());
}, 100);set the value by key for the current id
keythe keyvaluethe valuelinkedTopset the value linked to top
const assert = require('assert');
const als = require('async-local-storage');
const crypto = require('crypto');
const randomBytes = length => crypto.randomBytes(length).toString('hex')
als.enable()
setTimeout(() => {
const id = randomBytes(8);
als.set('id', id);
const check = (times, id, subId) => {
assert.equal(als.get('id'), id);
assert.equal(als.get('subId'), subId);
if (times < 0) {
done();
} else {
setTimeout(() => {
check(times - 1, id, subId);
}, 10);
}
};
setTimeout(() => {
const subId = randomBytes(8);
als.set('subId', subId);
assert.equal(als.get('id'), id);
check(3, id, subId);
}, 10);
}, 10);get the value by key, if will find from parent, self --> parent --> parent, until the value is not undefined
keythe key
const assert = require('assert');
const als = require('async-local-storage');
const crypto = require('crypto');
const randomBytes = length => crypto.randomBytes(length).toString('hex')
als.enable()
setTimeout(() => {
const id = randomBytes(8);
als.set('id', id);
const check = (times, id, subId) => {
assert.equal(als.get('id'), id);
assert.equal(als.get('subId'), subId);
if (times < 0) {
done();
} else {
setTimeout(() => {
check(times - 1, id, subId);
}, 10);
}
};
setTimeout(() => {
const subId = randomBytes(8);
als.set('subId', subId);
assert.equal(als.get('id'), id);
check(3, id, subId);
}, 10);
}, 10);Get the current id
const assert = require('assert');
const als = require('async-local-storage');
als.enable();
setTimeout(() => {
assert(als.currentId());
}, 10);idThe tigger id, default isals.currentId()
const assert = require('assert');
const als = require('async-local-storage');
als.enable();
setTimeout(() => {
assert(als.use());
}, 10);Enable all value linked to top
Disable all value linked to top
MIT