使用物件來提升效能
當您呼叫傳回物件的 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);
}
這是否有幫助?