使用对象以提高性能
调用返回对象的 API 时,最好将对象存储在本地变量中,而非对 API 进行多次调用。此外,更好是调用单个 API 来获取所需的全部内容,而非调用更为基本的 API 来逐次获取事物。根据服务器配置的不同,API 可能需要从服务器到其他资源的往返。
示例:获取属性方面信息
在本示例中,我们将检索事物各属性方面的信息。为此,我们将获取 JSON 格式的事物信息,然后从属性定义中提取信息。因此,我们将调用两次 API 以构建 JSON 信息。
Things[thingName] 按名称搜索所需的事物。
GetMetadataAsJSON() 遍历事物实体层次结构以构建事物的 JSON 信息。
错误方法:
在本示例中,我们每次都搜索事物并在每次调用属性时均构建 JSON 表示。
var propertyNames = ["p1", "p2"]
for (var i = 0; i < propertyNames.length; i++)
logger.warn("Property [" + propertyNames[i] + "] cacheTime: " + Things[me.name].GetMetadataAsJSON().propertyDefinitions[propertyNames[i]].aspects.cacheTime)
}
正确方法:
本示例将搜索一次事物,构建一次 JSON 对象,然后从每个属性的属性定义中获取值。如果针对事物进行多项操作,则可基于 Things[thingName] 构建事物变量。在这种情况下,我们只需要属性定义,因此我们也只需保存这部分内容。
var propertyNames = ["p1", "p2"]
var propertyDefinitions = Things[me.name].GetMetadataAsJSON().propertyDefinitions
for (var i = 0; i < propertyNames.length; i++)
logger.warn("Property [" + propertyNames[i] + "] cacheTime: " + propertyDefinitions[propertyNames[i]].aspects.cacheTime)
}
示例:获取属性名称
在本示例中,我们通过从事物中获取属性定义并构建名称列表来构建属性名称列表。我们调用两次 API。
Things[thingName] 按名称搜索所需的事物。
GetPropertyDefinitions() 调用事物并遍历层次结构以构建属性定义列表。
错误方法:
这是一个反面示例,其调用 API 来获取属性数目,然后每次调用定义来获取名称和说明。事物搜索和属性定义对于每个属性而言至少被调用两次。
for (var i = 0; i < Things["MyThing"].GetPropertyDefinitions().length; i++) {
var newEntry = new Object();
newEntry.name = Things["MyThing"].GetPropertyDefinitions().rows[i].name;
newEntry.description = Things["MyThing"].GetPropertyDefinitions().rows[i].description;
result.AddRow(newEntry);
}
正确方法:
本示例针对所有属性仅调用一次事物和属性定义 API。
var propDefs = Things["MyThing"].GetPropertyDefinitions();
for (var i = 0; i < propDefs.length; i++) {
var newEntry = new Object();
newEntry.name = propDefs.rows[i].name;
newEntry.description = propDefs.rows[i].description;
result.AddRow(newEntry);
}
这对您有帮助吗?