【问题标题】:Using async callback on the Forge Dataviz API在 Forge Dataviz API 上使用异步回调
【发布时间】:2021-09-19 17:13:32
【问题描述】:

在尝试使用新的 Forge Datavisualization API 将我的自定义数据添加到热图中,但我在尝试使用异步函数将数据链接到热图时遇到问题。

我想在getSensorValue 回调中调用异步获取函数。如果我只返回一个 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 但没有成功...:

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 异步逻辑?

【问题讨论】:

  • 问题是,您将await getSensorValue 作为函数参数传递给dataVizExt.renderSurfaceShading ...因为getSensorValue 不是承诺,没有什么可等待的,所以,该行可能是好吧,dataVizExt.renderSurfaceShading(floorName, sensorType, getSensorValue); 显然是行不通的,因为你的 getSensorValue 的调用者期望的是一个值,而不是一个 Promise - 我看不到它的解决方法

标签: javascript autodesk-forge


【解决方案1】:

好的,我做到了。这不是最优雅也不是最漂亮的解决方案,但它确实有效。

//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 扩展的这个特定端点上使用异步功能,但这就是我现在需要的工作。

【讨论】:

    猜你喜欢
    • 2015-09-03
    • 2021-08-15
    • 2022-10-17
    • 1970-01-01
    • 2013-04-01
    • 2021-10-16
    • 2021-07-27
    • 2021-11-01
    • 1970-01-01
    相关资源
    最近更新 更多