Get the value like thread-local storage in threaded programming
npm install async-local-storage



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.
``js`
const als = require('async-local-storage');
als.enable();
setTimeout(() => {
als.scope();
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
`js`
const als = require('async-local-storage');
als.enable();
disable the async hooks
`js`
const als = require('async-local-storage');
als.enable();
setTimeout(() => {
als.disable();
}, 100);
get the size of storage
`js`
const als = require('async-local-storage');
als.enable();
setTimeout(() => {
console.info(als.size());
}, 100);
change the scope of call chain, it will be the call chain top (remove the parent of itself)
`js
const als = require('async-local-storage');
const Koa = require('koa');
const assert = require('assert');
const app = new Koa();
app.use(async (ctx, next) => {
const id = ctx.get('X-Request-Id');
als.scope();
als.set('id', id);
await next();
});
app.use(async (ctx, next) => {
const id = ctx.get('X-Request-Id');
assert.equal(als.get('id'), id);
await next();
});
app.use((ctx) => {
ctx.body = 'OK';
});
`
set the value by key for the current id
- key the keyvalue
- the valuelinkedTop
- set the value linked to top
`js`
als.enable()
setTimeout(() => {
als.scope();
const id = randomBytes();
setTimeout(() => {
als.set('id', id, true);
}, 1);
setTimeout(() => {
assert.equal(als.get('id'), id);
}, 10);
}, 10);
get the value by key, if will find from parent, self --> parent --> parent, until the value is not undefined
- key the key
`js`
als.enable();
setTimeout(() => {
als.scope();
const id = randomBytes();
setTimeout(() => {
als.set('id', id, true);
}, 1);
setTimeout(() => {
assert.equal(als.get('id'), id);
}, 10);
}, 10);
enable linked top for default (default is disabled)
`js`
als.enable();
als.enableLinkedTop();
setTimeout(() => {
als.scope();
setTimeout(() => {
// the same as als.set('id', 'a', true)
als.set('id', 'a');
}, 10);
}, 10);
disable linked top for default
`js`
als.enable();
als.enableLinkedTop();
setTimeout(() => {
als.disableLinkedTop();
als.scope();
setTimeout(() => {
// the same as als.set('id', 'a', false)
als.set('id', 'a');
}, 10);
}, 10);
get the current id
`js`
const assert = require('assert');
als.enable();
setTimeout(() => {
console.info(als.currentId());
}, 10);
get the use time of id
- id The tigger id, default is als.currentId()
`js`
als.enable()
setTimeout(() => {
const id = als.currentId();
console.info(als.use(id));
}, 10);
enable create time of data, default is enabled.
`js`
als.enableCreateTime();
disable create time of data, it can save memory.
`js``
als.disableCreateTime();