第 2 章 使用 Hot Rod JS 客户端
了解将 Hot Rod JS 客户端与 Data Grid 搭配使用的一些示例。
2.1. hot Rod JS 客户端示例 复制链接链接已复制到粘贴板!
在安装和配置 Hot Rod JS 客户端后,请先尝试一些基本的缓存操作,然后再继续与数据网格进行更复杂的交互。
2.1.1. hello world 复制链接链接已复制到粘贴板!
在 Data Grid Server 上创建一个名为 "myCache" 的缓存,然后添加并检索条目。
var infinispan = require('infinispan'); // Connect to Data Grid Server. // Use an existing cache named "myCache". var connected = infinispan.client( {port: 11222, host: '127.0.0.1'}, { cacheName: 'myCache', clientIntelligence: 'BASIC', authentication: { enabled: true, saslMechanism: 'DIGEST-MD5', userName: 'username', password: 'changeme' } } ); connected.then(function (client) { console.log('Connected to `myCache`'); // Add an entry to the cache. var clientPut = client.put('hello', 'world'); // Retrieve the entry you added. var clientGet = clientPut.then( function() { return client.get('hello'); }); // Print the value of the entry. var showGet = clientGet.then( function(value) { console.log('get(hello)=' + value); }); // Disconnect from Data Grid Server. return client.disconnect(); }).catch(function(error) { // Log any errors. console.log("Got error: " + error.message); });
var infinispan = require('infinispan');
// Connect to Data Grid Server.
// Use an existing cache named "myCache".
var connected = infinispan.client(
{port: 11222, host: '127.0.0.1'},
{
cacheName: 'myCache',
clientIntelligence: 'BASIC',
authentication: {
enabled: true,
saslMechanism: 'DIGEST-MD5',
userName: 'username',
password: 'changeme'
}
}
);
connected.then(function (client) {
console.log('Connected to `myCache`');
// Add an entry to the cache.
var clientPut = client.put('hello', 'world');
// Retrieve the entry you added.
var clientGet = clientPut.then(
function() { return client.get('hello'); });
// Print the value of the entry.
var showGet = clientGet.then(
function(value) { console.log('get(hello)=' + value); });
// Disconnect from Data Grid Server.
return client.disconnect();
}).catch(function(error) {
// Log any errors.
console.log("Got error: " + error.message);
});
2.1.2. 使用条目和检索缓存统计信息 复制链接链接已复制到粘贴板!
添加、检索、删除单个条目和查看缓存统计信息。
var infinispan = require('infinispan'); var connected = infinispan.client( {port: 11222, host: '127.0.0.1'}, { cacheName: 'myCache', authentication: { enabled: true, saslMechanism: 'DIGEST-MD5', userName: 'username', password: 'changeme' } } ); connected.then(function (client) { var clientPut = client.put('key', 'value'); var clientGet = clientPut.then( function() { return client.get('key'); }); var showGet = clientGet.then( function(value) { console.log('get(key)=' + value); }); var clientRemove = showGet.then( function() { return client.remove('key'); }); var showRemove = clientRemove.then( function(success) { console.log('remove(key)=' + success); }); var clientStats = showRemove.then( function() { return client.stats(); }); var showStats = clientStats.then( function(stats) { console.log('Number of stores: ' + stats.stores); console.log('Number of cache hits: ' + stats.hits); console.log('All statistics: ' + JSON.stringify(stats, null, " ")); }); return showStats.finally( function() { return client.disconnect(); }); }).catch(function(error) { console.log("Got error: " + error.message); });
var infinispan = require('infinispan');
var connected = infinispan.client(
{port: 11222, host: '127.0.0.1'},
{
cacheName: 'myCache',
authentication: {
enabled: true,
saslMechanism: 'DIGEST-MD5',
userName: 'username',
password: 'changeme'
}
}
);
connected.then(function (client) {
var clientPut = client.put('key', 'value');
var clientGet = clientPut.then(
function() { return client.get('key'); });
var showGet = clientGet.then(
function(value) { console.log('get(key)=' + value); });
var clientRemove = showGet.then(
function() { return client.remove('key'); });
var showRemove = clientRemove.then(
function(success) { console.log('remove(key)=' + success); });
var clientStats = showRemove.then(
function() { return client.stats(); });
var showStats = clientStats.then(
function(stats) {
console.log('Number of stores: ' + stats.stores);
console.log('Number of cache hits: ' + stats.hits);
console.log('All statistics: ' + JSON.stringify(stats, null, " "));
});
return showStats.finally(
function() { return client.disconnect(); });
}).catch(function(error) {
console.log("Got error: " + error.message);
});
2.1.3. 使用多个缓存条目 复制链接链接已复制到粘贴板!
使用简单递归循环创建多个缓存条目。
var infinispan = require('infinispan'); var connected = infinispan.client( {port: 11222, host: '127.0.0.1'}, { cacheName: 'myCache', authentication: { enabled: true, saslMechanism: 'DIGEST-MD5', userName: 'username', password: 'changeme' } } ); connected.then(function (client) { var data = [ {key: 'multi1', value: 'v1'}, {key: 'multi2', value: 'v2'}, {key: 'multi3', value: 'v3'}]; var clientPutAll = client.putAll(data); var clientGetAll = clientPutAll.then( function() { return client.getAll(['multi2', 'multi3']); }); var showGetAll = clientGetAll.then( function(entries) { console.log('getAll(multi2, multi3)=%s', JSON.stringify(entries)); } ); var clientIterator = showGetAll.then( function() { return client.iterator(1); }); var showIterated = clientIterator.then( function(it) { function loop(promise, fn) { // Simple recursive loop over the iterator's next() call. return promise.then(fn).then(function (entry) { return entry.done ? it.close().then(function () { return entry.value; }) : loop(it.next(), fn); }); } return loop(it.next(), function (entry) { console.log('iterator.next()=' + JSON.stringify(entry)); return entry; }); } ); var clientClear = showIterated.then( function() { return client.clear(); }); return clientClear.finally( function() { return client.disconnect(); }); }).catch(function(error) { console.log("Got error: " + error.message); });
var infinispan = require('infinispan');
var connected = infinispan.client(
{port: 11222, host: '127.0.0.1'},
{
cacheName: 'myCache',
authentication: {
enabled: true,
saslMechanism: 'DIGEST-MD5',
userName: 'username',
password: 'changeme'
}
}
);
connected.then(function (client) {
var data = [
{key: 'multi1', value: 'v1'},
{key: 'multi2', value: 'v2'},
{key: 'multi3', value: 'v3'}];
var clientPutAll = client.putAll(data);
var clientGetAll = clientPutAll.then(
function() { return client.getAll(['multi2', 'multi3']); });
var showGetAll = clientGetAll.then(
function(entries) {
console.log('getAll(multi2, multi3)=%s', JSON.stringify(entries));
}
);
var clientIterator = showGetAll.then(
function() { return client.iterator(1); });
var showIterated = clientIterator.then(
function(it) {
function loop(promise, fn) {
// Simple recursive loop over the iterator's next() call.
return promise.then(fn).then(function (entry) {
return entry.done
? it.close().then(function () { return entry.value; })
: loop(it.next(), fn);
});
}
return loop(it.next(), function (entry) {
console.log('iterator.next()=' + JSON.stringify(entry));
return entry;
});
}
);
var clientClear = showIterated.then(
function() { return client.clear(); });
return clientClear.finally(
function() { return client.disconnect(); });
}).catch(function(error) {
console.log("Got error: " + error.message);
});
2.1.4. 使用 Async 和 Await 结构 复制链接链接已复制到粘贴板!
Node.js 提供 async
和 await
结构,可简化缓存操作。
单个缓存条目
const infinispan = require("infinispan"); const log4js = require('log4js'); log4js.configure('example-log4js.json'); async function test() { await new Promise((resolve, reject) => setTimeout(() => resolve(), 1000)); console.log('Hello, World!'); let client = await infinispan.client({port: 11222, host: '127.0.0.1'}); console.log(`Connected to Infinispan dashboard data`); await client.put('key', 'value'); let value = await client.get('key'); console.log('get(key)=' + value); let success = await client.remove('key'); console.log('remove(key)=' + success); let stats = await client.stats(); console.log('Number of stores: ' + stats.stores); console.log('Number of cache hits: ' + stats.hits); console.log('All statistics: ' + JSON.stringify(stats, null, " ")); await client.disconnect(); } test();
const infinispan = require("infinispan");
const log4js = require('log4js');
log4js.configure('example-log4js.json');
async function test() {
await new Promise((resolve, reject) => setTimeout(() => resolve(), 1000));
console.log('Hello, World!');
let client = await infinispan.client({port: 11222, host: '127.0.0.1'});
console.log(`Connected to Infinispan dashboard data`);
await client.put('key', 'value');
let value = await client.get('key');
console.log('get(key)=' + value);
let success = await client.remove('key');
console.log('remove(key)=' + success);
let stats = await client.stats();
console.log('Number of stores: ' + stats.stores);
console.log('Number of cache hits: ' + stats.hits);
console.log('All statistics: ' + JSON.stringify(stats, null, " "));
await client.disconnect();
}
test();
多个缓存条目
const infinispan = require("infinispan"); const log4js = require('log4js'); log4js.configure('example-log4js.json'); async function test() { let client = await infinispan.client({port: 11222, host: '127.0.0.1'}); console.log(`Connected to Infinispan dashboard data`); let data = [ {key: 'multi1', value: 'v1'}, {key: 'multi2', value: 'v2'}, {key: 'multi3', value: 'v3'}]; await client.putAll(data); let entries = await client.getAll(['multi2', 'multi3']); console.log('getAll(multi2, multi3)=%s', JSON.stringify(entries)); let iterator = await client.iterator(1); let entry = {done: true}; do { entry = await iterator.next(); console.log('iterator.next()=' + JSON.stringify(entry)); } while (!entry.done); await iterator.close(); await client.clear(); await client.disconnect(); } test();
const infinispan = require("infinispan");
const log4js = require('log4js');
log4js.configure('example-log4js.json');
async function test() {
let client = await infinispan.client({port: 11222, host: '127.0.0.1'});
console.log(`Connected to Infinispan dashboard data`);
let data = [
{key: 'multi1', value: 'v1'},
{key: 'multi2', value: 'v2'},
{key: 'multi3', value: 'v3'}];
await client.putAll(data);
let entries = await client.getAll(['multi2', 'multi3']);
console.log('getAll(multi2, multi3)=%s', JSON.stringify(entries));
let iterator = await client.iterator(1);
let entry = {done: true};
do {
entry = await iterator.next();
console.log('iterator.next()=' + JSON.stringify(entry));
} while (!entry.done);
await iterator.close();
await client.clear();
await client.disconnect();
}
test();
2.1.5. 运行服务器端脚本 复制链接链接已复制到粘贴板!
您可以将自定义脚本添加到 Data Grid Server,然后从 Hot Rod JS 客户端运行它们。
脚本示例
// mode=local,language=javascript,parameters=[k, v],datatype='text/plain; charset=utf-8' cache.put(k, v); cache.get(k);
// mode=local,language=javascript,parameters=[k, v],datatype='text/plain; charset=utf-8'
cache.put(k, v);
cache.get(k);
脚本执行
var infinispan = require('infinispan'); var readFile = Promise.denodeify(require('fs').readFile); var connected = infinispan.client( {port: 11222, host: '127.0.0.1'} { // Configure client connections with authentication and encryption here. } ); connected.then(function (client) { var addScriptFile = readFile('sample-script.js').then( function(file) { return client.addScript('sample-script', file.toString()); }); var clientExecute = addScriptFile.then( function() { return client.execute('sample-script', {k: 'exec-key', v: 'exec-value'}); }); var showExecute = clientExecute.then( function(ret) { console.log('Script execution returned: ' + ret); }); return showExecute.finally( function() { return client.disconnect(); }); }).catch(function(error) { console.log("Got error: " + error.message); });
var infinispan = require('infinispan');
var readFile = Promise.denodeify(require('fs').readFile);
var connected = infinispan.client(
{port: 11222, host: '127.0.0.1'}
{
// Configure client connections with authentication and encryption here.
}
);
connected.then(function (client) {
var addScriptFile = readFile('sample-script.js').then(
function(file) {
return client.addScript('sample-script', file.toString());
});
var clientExecute = addScriptFile.then(
function() {
return client.execute('sample-script', {k: 'exec-key', v: 'exec-value'});
});
var showExecute = clientExecute.then(
function(ret) { console.log('Script execution returned: ' + ret); });
return showExecute.finally(
function() { return client.disconnect(); });
}).catch(function(error) {
console.log("Got error: " + error.message);
});
2.1.6. 注册事件监听程序 复制链接链接已复制到粘贴板!
事件监听器在缓存更新发生时通知 Hot Rod JS 客户端,包括创建、修改、删除或过期条目。
用于条目创建和修改通知客户端有关键和值的事件。仅删除条目和过期通知客户端有关密钥的事件。
事件监听程序注册
var infinispan = require('infinispan'); var connected = infinispan.client( {port: 11222, host: '127.0.0.1'} { // Configure client connections with authentication and encryption here. } ); connected.then(function (client) { var clientAddListenerCreate = client.addListener('create', onCreate); var clientAddListeners = clientAddListenerCreate.then( function(listenerId) { // Associate multiple callbacks with a single client-side listener. // To do this, register listeners with the same listener ID. var clientAddListenerModify = client.addListener('modify', onModify, {listenerId: listenerId}); var clientAddListenerRemove = client.addListener('remove', onRemove, {listenerId: listenerId}); return Promise.all([clientAddListenerModify, clientAddListenerRemove]); }); var clientCreate = clientAddListeners.then( function() { return client.putIfAbsent('eventful', 'v0'); }); var clientModify = clientCreate.then( function() { return client.replace('eventful', 'v1'); }); var clientRemove = clientModify.then( function() { return client.remove('eventful'); }); var clientRemoveListener = Promise.all([clientAddListenerCreate, clientRemove]).then( function(values) { var listenerId = values[0]; return client.removeListener(listenerId); }); return clientRemoveListener.finally( function() { return client.disconnect(); }); }).catch(function(error) { console.log("Got error: " + error.message); }); function onCreate(key, version) { console.log('[Event] Created key: ' + key + ' with version: ' + JSON.stringify(version)); } function onModify(key, version) { console.log('[Event] Modified key: ' + key + ', version after update: ' + JSON.stringify(version)); } function onRemove(key) { console.log('[Event] Removed key: ' + key); }
var infinispan = require('infinispan');
var connected = infinispan.client(
{port: 11222, host: '127.0.0.1'}
{
// Configure client connections with authentication and encryption here.
}
);
connected.then(function (client) {
var clientAddListenerCreate = client.addListener('create', onCreate);
var clientAddListeners = clientAddListenerCreate.then(
function(listenerId) {
// Associate multiple callbacks with a single client-side listener.
// To do this, register listeners with the same listener ID.
var clientAddListenerModify =
client.addListener('modify', onModify, {listenerId: listenerId});
var clientAddListenerRemove =
client.addListener('remove', onRemove, {listenerId: listenerId});
return Promise.all([clientAddListenerModify, clientAddListenerRemove]);
});
var clientCreate = clientAddListeners.then(
function() { return client.putIfAbsent('eventful', 'v0'); });
var clientModify = clientCreate.then(
function() { return client.replace('eventful', 'v1'); });
var clientRemove = clientModify.then(
function() { return client.remove('eventful'); });
var clientRemoveListener =
Promise.all([clientAddListenerCreate, clientRemove]).then(
function(values) {
var listenerId = values[0];
return client.removeListener(listenerId);
});
return clientRemoveListener.finally(
function() { return client.disconnect(); });
}).catch(function(error) {
console.log("Got error: " + error.message);
});
function onCreate(key, version) {
console.log('[Event] Created key: ' + key +
' with version: ' + JSON.stringify(version));
}
function onModify(key, version) {
console.log('[Event] Modified key: ' + key +
', version after update: ' + JSON.stringify(version));
}
function onRemove(key) {
console.log('[Event] Removed key: ' + key);
}
您可以调整来自事件监听程序的通知,以避免使用 key-value-with-previous-converter-factory
转换程序进行不必要的往返。例如,这允许您查找与事件内键关联的值,而不是在以后检索它们。
远程事件转换器
var infinispan = require('infinispan'); var connected = infinispan.client( {port: 11222, host: '127.0.0.1'} , { dataFormat : { keyType: 'application/json', valueType: 'application/json' } } ); connected.then(function (client) { // Include the remote event converter to avoid unnecessary roundtrips. var opts = { converterFactory : { name: "key-value-with-previous-converter-factory" } }; var clientAddListenerCreate = client.addListener('create', logEvent("Created"), opts); var clientAddListeners = clientAddListenerCreate.then( function(listenerId) { // Associate multiple callbacks with a single client-side listener. // To do this, register listeners with the same listener ID. var clientAddListenerModify = client.addListener('modify', logEvent("Modified"), {opts, listenerId: listenerId}); var clientAddListenerRemove = client.addListener('remove', logEvent("Removed"), {opts, listenerId: listenerId}); return Promise.all([clientAddListenerModify, clientAddListenerRemove]); }); var clientCreate = clientAddListeners.then( function() { return client.putIfAbsent('converted', 'v0'); }); var clientModify = clientCreate.then( function() { return client.replace('converted', 'v1'); }); var clientRemove = clientModify.then( function() { return client.remove('converted'); }); var clientRemoveListener = Promise.all([clientAddListenerCreate, clientRemove]).then( function(values) { var listenerId = values[0]; return client.removeListener(listenerId); }); return clientRemoveListener.finally( function() { return client.disconnect(); }); }).catch(function(error) { console.log("Got error: " + error.message); }); function logEvent(prefix) { return function(event) { console.log(prefix + " key: " + event.key); console.log(prefix + " value: " + event.value); console.log(prefix + " previous value: " + event.prev); } }
var infinispan = require('infinispan');
var connected = infinispan.client(
{port: 11222, host: '127.0.0.1'}
, {
dataFormat : {
keyType: 'application/json',
valueType: 'application/json'
}
}
);
connected.then(function (client) {
// Include the remote event converter to avoid unnecessary roundtrips.
var opts = {
converterFactory : {
name: "key-value-with-previous-converter-factory"
}
};
var clientAddListenerCreate = client.addListener('create', logEvent("Created"), opts);
var clientAddListeners = clientAddListenerCreate.then(
function(listenerId) {
// Associate multiple callbacks with a single client-side listener.
// To do this, register listeners with the same listener ID.
var clientAddListenerModify =
client.addListener('modify', logEvent("Modified"), {opts, listenerId: listenerId});
var clientAddListenerRemove =
client.addListener('remove', logEvent("Removed"), {opts, listenerId: listenerId});
return Promise.all([clientAddListenerModify, clientAddListenerRemove]);
});
var clientCreate = clientAddListeners.then(
function() { return client.putIfAbsent('converted', 'v0'); });
var clientModify = clientCreate.then(
function() { return client.replace('converted', 'v1'); });
var clientRemove = clientModify.then(
function() { return client.remove('converted'); });
var clientRemoveListener =
Promise.all([clientAddListenerCreate, clientRemove]).then(
function(values) {
var listenerId = values[0];
return client.removeListener(listenerId);
});
return clientRemoveListener.finally(
function() { return client.disconnect(); });
}).catch(function(error) {
console.log("Got error: " + error.message);
});
function logEvent(prefix) {
return function(event) {
console.log(prefix + " key: " + event.key);
console.log(prefix + " value: " + event.value);
console.log(prefix + " previous value: " + event.prev);
}
}
您可以将自定义转换器添加到 Data Grid Server。如需更多信息,请参阅 Data Grid 文档。
2.1.7. 使用条件操作 复制链接链接已复制到粘贴板!
Hot Rod 协议存储有关数据网格值的元数据。这个元数据提供了一个确定性因素,可让您为特定条件执行缓存操作。例如,如果版本不匹配,则需要替换键的值。
使用 getWithMetadata
方法检索与键值关联的元数据。
var infinispan = require('infinispan'); var connected = infinispan.client( {port: 11222, host: '127.0.0.1'} { // Configure client connections with authentication and encryption here. } ); connected.then(function (client) { var clientPut = client.putIfAbsent('cond', 'v0'); var showPut = clientPut.then( function(success) { console.log(':putIfAbsent(cond)=' + success); }); var clientReplace = showPut.then( function() { return client.replace('cond', 'v1'); } ); var showReplace = clientReplace.then( function(success) { console.log('replace(cond)=' + success); }); var clientGetMetaForReplace = showReplace.then( function() { return client.getWithMetadata('cond'); }); // Call the getWithMetadata method to retrieve the value and its metadata. var clientReplaceWithVersion = clientGetMetaForReplace.then( function(entry) { console.log('getWithMetadata(cond)=' + JSON.stringify(entry)); return client.replaceWithVersion('cond', 'v2', entry.version); } ); var showReplaceWithVersion = clientReplaceWithVersion.then( function(success) { console.log('replaceWithVersion(cond)=' + success); }); var clientGetMetaForRemove = showReplaceWithVersion.then( function() { return client.getWithMetadata('cond'); }); var clientRemoveWithVersion = clientGetMetaForRemove.then( function(entry) { console.log('getWithMetadata(cond)=' + JSON.stringify(entry)); return client.removeWithVersion('cond', entry.version); } ); var showRemoveWithVersion = clientRemoveWithVersion.then( function(success) { console.log('removeWithVersion(cond)=' + success)}); return showRemoveWithVersion.finally( function() { return client.disconnect(); }); }).catch(function(error) { console.log("Got error: " + error.message); });
var infinispan = require('infinispan');
var connected = infinispan.client(
{port: 11222, host: '127.0.0.1'}
{
// Configure client connections with authentication and encryption here.
}
);
connected.then(function (client) {
var clientPut = client.putIfAbsent('cond', 'v0');
var showPut = clientPut.then(
function(success) { console.log(':putIfAbsent(cond)=' + success); });
var clientReplace = showPut.then(
function() { return client.replace('cond', 'v1'); } );
var showReplace = clientReplace.then(
function(success) { console.log('replace(cond)=' + success); });
var clientGetMetaForReplace = showReplace.then(
function() { return client.getWithMetadata('cond'); });
// Call the getWithMetadata method to retrieve the value and its metadata.
var clientReplaceWithVersion = clientGetMetaForReplace.then(
function(entry) {
console.log('getWithMetadata(cond)=' + JSON.stringify(entry));
return client.replaceWithVersion('cond', 'v2', entry.version);
}
);
var showReplaceWithVersion = clientReplaceWithVersion.then(
function(success) { console.log('replaceWithVersion(cond)=' + success); });
var clientGetMetaForRemove = showReplaceWithVersion.then(
function() { return client.getWithMetadata('cond'); });
var clientRemoveWithVersion = clientGetMetaForRemove.then(
function(entry) {
console.log('getWithMetadata(cond)=' + JSON.stringify(entry));
return client.removeWithVersion('cond', entry.version);
}
);
var showRemoveWithVersion = clientRemoveWithVersion.then(
function(success) { console.log('removeWithVersion(cond)=' + success)});
return showRemoveWithVersion.finally(
function() { return client.disconnect(); });
}).catch(function(error) {
console.log("Got error: " + error.message);
});
2.1.8. 使用临时数据 复制链接链接已复制到粘贴板!
使用 getWithMetadata
和 size
方法使缓存条目过期。
var infinispan = require('infinispan'); var connected = infinispan.client( {port: 11222, host: '127.0.0.1'} { // Configure client connections with authentication and encryption here. } ); connected.then(function (client) { var clientPutExpiry = client.put('expiry', 'value', {lifespan: '1s'}); var clientGetMetaAndSize = clientPutExpiry.then( function() { // Compute getWithMetadata and size in parallel. return Promise.all([client.getWithMetadata('expiry'), client.size()]); }); var showGetMetaAndSize = clientGetMetaAndSize.then( function(values) { console.log('Before expiration:'); console.log('getWithMetadata(expiry)=' + JSON.stringify(values[0])); console.log('size=' + values[1]); }); var clientContainsAndSize = showGetMetaAndSize.then( function() { sleepFor(1100); // Sleep to force expiration. return Promise.all([client.containsKey('expiry'), client.size()]); }); var showContainsAndSize = clientContainsAndSize.then( function(values) { console.log('After expiration:'); console.log('containsKey(expiry)=' + values[0]); console.log('size=' + values[1]); }); return showContainsAndSize.finally( function() { return client.disconnect(); }); }).catch(function(error) { console.log("Got error: " + error.message); }); function sleepFor(sleepDuration){ var now = new Date().getTime(); while(new Date().getTime() < now + sleepDuration){ /* Do nothing. */ } }
var infinispan = require('infinispan');
var connected = infinispan.client(
{port: 11222, host: '127.0.0.1'}
{
// Configure client connections with authentication and encryption here.
}
);
connected.then(function (client) {
var clientPutExpiry = client.put('expiry', 'value', {lifespan: '1s'});
var clientGetMetaAndSize = clientPutExpiry.then(
function() {
// Compute getWithMetadata and size in parallel.
return Promise.all([client.getWithMetadata('expiry'), client.size()]);
});
var showGetMetaAndSize = clientGetMetaAndSize.then(
function(values) {
console.log('Before expiration:');
console.log('getWithMetadata(expiry)=' + JSON.stringify(values[0]));
console.log('size=' + values[1]);
});
var clientContainsAndSize = showGetMetaAndSize.then(
function() {
sleepFor(1100); // Sleep to force expiration.
return Promise.all([client.containsKey('expiry'), client.size()]);
});
var showContainsAndSize = clientContainsAndSize.then(
function(values) {
console.log('After expiration:');
console.log('containsKey(expiry)=' + values[0]);
console.log('size=' + values[1]);
});
return showContainsAndSize.finally(
function() { return client.disconnect(); });
}).catch(function(error) {
console.log("Got error: " + error.message);
});
function sleepFor(sleepDuration){
var now = new Date().getTime();
while(new Date().getTime() < now + sleepDuration){ /* Do nothing. */ }
}