在 Forge Dataviz 上使用异步回调 API
Using async callback on the Forge Dataviz API
在尝试使用新的 Forge 数据可视化 API 将我的自定义数据添加到热图时,但我在尝试使用异步函数 link 将数据添加到热图时遇到了问题。
我想在 getSensorValue
回调中调用异步获取函数。如果我只是 return a Math.random() 就可以了:
function getSensorValue(surfaceShadingPoint, sensorType) {
return Math.random();
}
但是每当我尝试添加任何可等待的函数时,它都不会渲染任何表面阴影:
[...]
function normalizeValue(value, min, max) {
return (value - min) / (max - min);
}
async function getSensorValue(surfaceShadingPoint, sensorType) {
let data = await asynchronousFunction();
data = data[data.length-1]
let temperature = (data[0].temperature);
return normalizeValue(temperature,19,37);
}
[...]
setInterval(async function () {
const floorName = 'A1_Level 1';
dataVizExt.renderSurfaceShading(floorName, sensorType, await getSensorValue);
}, 1000);
我也试过这样使用 Promises 但没有成功...:[=15=]
function getSensorValue(surfaceShadingPoint, sensorType) {
return (promise = new Promise((resolve, reject) => {
resolve(asynchronousFunction());
}));
}
function normalizeValue(value, min, max) {
return (value - min) / (max - min);
}
setInterval(function () {
const floorName = 'A1_Level 1';
dataVizExt.renderSurfaceShading(floorName, sensorType, () =>
getSensorValue().then((res) => {
let data = res;
data = data[data.length - 1];
let temperature = data.temperature;
return normalizeValue(temperature,22,40);
})
);
}, 1000);
我是否对 API 有任何误解,或者我搞砸了我的 JS 异步逻辑?
好的,我做到了。它不是最优雅也不是最漂亮的解决方案,但它确实有效。
//function that gets the data and formats it for the heatmap
async function getSensorValue() {
let data = await asynchronousFunction();
data = data[data.length - 1];
let temperature = data.temperature;
return normalizeValue(temperature,22,40);
}
//global variable that holds the last temperature value from the server
var normalizedValue;
//non async function that just returns the global variable.
//(It has to be function because the API expects it as a callback)
function getVar(surfaceShadingPoint, sensorType){
return normalizedValue;
}
//function that normalizes any value between 2 numbers
function normalizeValue(value, min, max) {
return (value - min) / (max - min);
}
//interval that tries to get new data from the server each X seconds.
setInterval(async function () {
normalizedValue = await getSensorValue();
if(normalizedValue){
const floorName = 'A1_Level 1';
dataVizExt.renderSurfaceShading(floorName, sensorType, getVar)
}
}, 2000);
我不知道您何时或是否能够在 Dataviz 扩展的这个特定端点上使用异步函数,但这正是我现在需要的工作。
在尝试使用新的 Forge 数据可视化 API 将我的自定义数据添加到热图时,但我在尝试使用异步函数 link 将数据添加到热图时遇到了问题。
我想在 getSensorValue
回调中调用异步获取函数。如果我只是 return a Math.random() 就可以了:
function getSensorValue(surfaceShadingPoint, sensorType) {
return Math.random();
}
但是每当我尝试添加任何可等待的函数时,它都不会渲染任何表面阴影:
[...]
function normalizeValue(value, min, max) {
return (value - min) / (max - min);
}
async function getSensorValue(surfaceShadingPoint, sensorType) {
let data = await asynchronousFunction();
data = data[data.length-1]
let temperature = (data[0].temperature);
return normalizeValue(temperature,19,37);
}
[...]
setInterval(async function () {
const floorName = 'A1_Level 1';
dataVizExt.renderSurfaceShading(floorName, sensorType, await getSensorValue);
}, 1000);
我也试过这样使用 Promises 但没有成功...:[=15=]
function getSensorValue(surfaceShadingPoint, sensorType) {
return (promise = new Promise((resolve, reject) => {
resolve(asynchronousFunction());
}));
}
function normalizeValue(value, min, max) {
return (value - min) / (max - min);
}
setInterval(function () {
const floorName = 'A1_Level 1';
dataVizExt.renderSurfaceShading(floorName, sensorType, () =>
getSensorValue().then((res) => {
let data = res;
data = data[data.length - 1];
let temperature = data.temperature;
return normalizeValue(temperature,22,40);
})
);
}, 1000);
我是否对 API 有任何误解,或者我搞砸了我的 JS 异步逻辑?
好的,我做到了。它不是最优雅也不是最漂亮的解决方案,但它确实有效。
//function that gets the data and formats it for the heatmap
async function getSensorValue() {
let data = await asynchronousFunction();
data = data[data.length - 1];
let temperature = data.temperature;
return normalizeValue(temperature,22,40);
}
//global variable that holds the last temperature value from the server
var normalizedValue;
//non async function that just returns the global variable.
//(It has to be function because the API expects it as a callback)
function getVar(surfaceShadingPoint, sensorType){
return normalizedValue;
}
//function that normalizes any value between 2 numbers
function normalizeValue(value, min, max) {
return (value - min) / (max - min);
}
//interval that tries to get new data from the server each X seconds.
setInterval(async function () {
normalizedValue = await getSensorValue();
if(normalizedValue){
const floorName = 'A1_Level 1';
dataVizExt.renderSurfaceShading(floorName, sensorType, getVar)
}
}, 2000);
我不知道您何时或是否能够在 Dataviz 扩展的这个特定端点上使用异步函数,但这正是我现在需要的工作。