[英]Using the N/Cache Module in SuiteScript 2.0
我正在尝试在自定义模块中实现 N/cache 模块的使用,以跨包保留数据,而无需每次需要数据时都从远程源检索数据。 所以我创建了这个来获取缓存数据:
function data_GetCachedData() {
var remoteInfo = null;
require(['N/cache'], function (cache) {
var rmtCache = cache.getCache({
name : _REMOTE_CACHE_NAME
, scope : cache.Scope.PROTECTED
});
remoteInfo = rmtCache.get({
key : _REMOTE_CACHE_INDEX
, loader : comms_ObtainRemoteData(params)
});
});
return JSON.parse(remoteInfo || "{ }");
}
我将其添加为加载程序:
function comms_ObtainRemoteData(params) {
var remoteData = null;
/*
make HTTPS calls to remote server to add values to 'remoteData'
*/
require(['N/cache'], function (cache) {
var rmtCache = cache.getCache({
name : _REMOTE_CACHE_NAME
, scope : cache.Scope.PROTECTED
});
ptCache.put({
key : _REMOTE_CACHE_INDEX
, value : remoteData.values
, ttl : (18 * 60 * 60)
});
});
return remoteData.values;
}
但是,我添加了一些日志记录,每次调用 GetCachedData 时,它总是会触发加载程序。 这有什么我想念的吗? 因为据我所知,这样做应该很好,而不必总是调用加载程序。
您的脚本每次都调用远程 function,因为您在带有参数的加载程序 function 之后放置了括号。 请参阅此行loader: comms_ObtainRemoteData(params)
如果您将其更改为loader: comms_ObtainRemoteData
那么您应该没问题。 cache.get 的“loader”选项需要 function 的名称,而不是 function 调用的返回结果。
我遇到了同样的问题,不得不切换代码。 以下是您的代码示例:
var rmtCache = cache.getCache({ name: _REMOTE_CACHE_NAME, scope: cache.Scope.PROTECTED }); if (rmtCache==null){ rmtCache = remoteData.values ptCache.put({ key: _REMOTE_CACHE_INDEX, value: rmtCache, ttl: (18 * 60 * 60) }); }
正如 NetSuite 明确指出的那样
不能保证缓存值在 ttl 值的整个持续时间内都保留在缓存中。 ttl 值表示可以存储缓存值的最长时间。
所以可能是由于资源紧缩(可能是由于在所述帐户中运行多个脚本/缓存)或缓存因未及时使用/请求而失效,它可以从 memory 重置/清除。
另外,您是否在测试(Dev/Sandbox)环境中测试您的脚本? 由于与生产环境相比,测试环境的资源有限。
我在我的开发环境中多次遇到同样的问题,但它似乎在生产环境中运行良好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.