Как исправить ошибку 't [i] .callbackFn.call не является функцией' при вызове model.getProperties - PullRequest
0 голосов
/ 26 июня 2019

Эта проблема была решена, хотя я пока не знаю как. Раздел кода, который я имею ниже, фактически не кажется виновником, так как он не был изменен до того, как ошибка перестала выдаваться. Насколько я могу судить, ничего другого, что должно вызвать эту ошибку, также не изменилось, поэтому я не уверен, что произошло. Если я выясню, что решило проблему, я опубликую ее как ответ. Сейчас я просто оставлю этот вопрос на тот случай, если другие люди тоже столкнутся с этой проблемой.


Я создаю веб-приложение, которое использует API для просмотра моделей из Forge. Я получаю странную ошибку при вызове model.getProperties в моем коде (где модель взята из Viewer3D.model), и мне трудно понять, как это исправить. Трассировка стека в ошибке не показывает никакого моего собственного кода, только код из API, но благодаря отладке я смог изолировать его для вызова model.getPropeties внутри обработчика SELECTION_CHANGED_EVENT.

Ошибка выглядит следующим образом:

TypeError: t[i].callbackFn.call is not a function
    at D.dispatchEvent (https://developer.api.autodesk.com/modelderivative/v2/viewers/6.*/viewer3D.min.js:19:549356)
    at i (https://developer.api.autodesk.com/modelderivative/v2/viewers/6.*/viewer3D.min.js:19:764740)
    at u.setSelection (https://developer.api.autodesk.com/modelderivative/v2/viewers/6.*/viewer3D.min.js:19:766265)
    at i.handleAction (https://developer.api.autodesk.com/modelderivative/v2/viewers/6.*/viewer3D.min.js:30:240200)
    at i.handleSingleClick (https://developer.api.autodesk.com/modelderivative/v2/viewers/6.*/viewer3D.min.js:30:241136)
    at s.__invokeStack (https://developer.api.autodesk.com/modelderivative/v2/viewers/6.*/viewer3D.min.js:30:229550)
    at s.handleSingleClick (https://developer.api.autodesk.com/modelderivative/v2/viewers/6.*/viewer3D.min.js:30:229926)
    at s.mouseup (https://developer.api.autodesk.com/modelderivative/v2/viewers/6.*/viewer3D.min.js:30:233391)
    at HTMLDocument.e (https://developer.api.autodesk.com/modelderivative/v2/viewers/6.*/viewer3D.min.js:30:233007)

Я завернул вызов model.getProperties в обещание, чтобы я мог ожидать его в моей асинхронной функции. Кажется, что функция работает и возвращает правильное значение, но она также асинхронно выдает ошибку. Я завернул ожидаемый вызов в оператор try catch, но ошибка не обнаруживается. Вместо этого ошибка выдается сразу после того, как вызов «успешен», но до того, как будут сделаны любые другие вызовы.

Я вижу из отладчика, что я получаю ожидаемые значения от функции, но ошибка по-прежнему выдается.


viewer.addEventListener(
            Autodesk.Viewing.SELECTION_CHANGED_EVENT,
            onSelectionChange);

async function onSelectionChange(event){
    var dbIds = event.dbIdArray;
    if (dbIds && dbIds.length > 0) {
        await doSomething(event.model, dbIds[0]);
    }
}

function getElementProperties(model, dbId) {
    return new Promise(function(resolve, reject) {
        model.getProperties(dbId, resolve, reject);
    });
}

async function doSomething(model, dbId) {
    var properties = null;

    try {
        // This call works and properties is changed to the correct object
        properties = await getElementProperties(model, dbId);
    }
    catch(err) {
        // The code doesn't get here. The error isn't caught
        console.log(err);
    }

    // When the debugger moves on to this comparison, but before it is executed, 
    // the console shows the error
    if (properties != null) {
        // properties is not null. It is formatted as I expect it to be
    }
}

Что также странно, так это то, что эта ошибка выдается только после успешного выполнения одного вызова. Я использую это, чтобы получить свойства выбранного пользователем элемента. Первый выбор будет работать правильно, но все последующие варианты выбрасывают ошибку. Все остальное работает нормально, включая части кода, которые полагаются на «свойства». Кто-нибудь знает, почему это происходит и как я могу это исправить?

...