Пытаясь извлечь определенные фрагменты данных из записи LRS, нужна помощь в перехвате

У меня есть скрипт, который на 90% завершен и работает. Я использую старый код для получения отчетов LRS. Это тот, который использует tincan.js. Я пытаюсь разобрать и проанализировать следующее: субъект, глагол, объект, метка времени и идентификатор в contextActivities. Это последний, который дает мне припадки. Не могли бы вы взглянуть на мое последнее утверждение "поймать и попробовать" и скажите, где я ошибаюсь? Спасибо.

<!DOCTYPE  html>
<!--Parsing "resumed" statements-->
<html lang='en'> 
    <head> 
        <meta charset='UTF-8'> 
        <title>Get my Statements</title> 
        <script type="text/javascript" src="build/tincan.js"></script> 
    </head> 
    <body> 
        <h1>Get statements  101</h1> 
        <div id='response'></div>
        <script>
      var lrs;

try {
    lrs = new TinCan.LRS(
        {

            endpoint: "https://lrs.adlnet.gov/xapi/",
            username: "xapi-tools",
            password: "xapi-tools",
            allowFail: false
        }
    );
}
catch (ex) {
    console.log("Failed to setup LRS object: " + ex);
    // TODO: do something with error, can't communicate with LRS
}


//Pulls all of the resumed statements

lrs.queryStatements(
    {
        params: {
            verb: new TinCan.Verb(
                {
                    id: "http://adlnet.gov/expapi/verbs/completed"
                }
            ),
            since: "2016-01-05T08:34:16Z"
        },
        callback: function (err, sr) {
            if (err !== null) {
                console.log("Failed to query statements: " + err);
                // TODO: do something with error, didn't get statements
                return;
            }

            if (sr.more !== null) {
                // TODO: additional page(s) of statements should be fetched
            }

            var container =  document.getElementById('response');
            //container.innerHTML = (err !== null ? 'ERROR' : JSON.stringify(sr.statements));
            container.innerHTML = (err !== null ? 'ERROR' : parseMyData(sr));
        }
    }
);


parseMyData = function(result) {
            var statements = result.statements;
            var output = '';
            var name,verb,activity, timestamp, context;
            for(var i=0;i<statements.length;i++){
                // check the statement for a usable name value
                // (priority = actor.name, actor.mbox, actor.account.name)
                if(statements[i].actor.name != null && statements[i].actor.name != "") {
                    name = statements[i].actor.name
                }else if(statements[i].actor.mbox != null && statements[i].actor.mbox != "") {
                    name = statements[i].actor.mbox
                }else{
                    name = statements[i].actor.account.name
                }
                // check the statement for a usable verb value
                // (priority = verb.display['en-US'], verb.id)
                try{
                    verb = statements[i].verb.display['en-US'];
                }catch(e){
                    verb = statements[i].verb.id;
                }
                // check the activity for a usable value
                // (priority = definition.name['en-US'], id)
                try{
                    activity = statements[i].target.definition.name['en-US'];
                }catch(e){
                    activity = statements[i].target.id;
                }
                try{
                    timestamp = statements[i].timestamp;
                }catch(e){
                    timestamp = statements[i].timestamp;
                }

                try{
                    context = statements[i].target.contextActivities.other['id'];
                }catch(e){
                    context = statements[i].activity.other['id'];
                }

                output +=   name + ' - ' +
                            verb + ' - ' + 
                            activity + ' - ' +
                            timestamp + ' - ' +
                            context +
                            '<br>' 
            }
            return output;
}

        </script> 
    </body> 
</html>

1 ответ

Решение

Вы пытаетесь получить доступ к свойству, которое никогда не будет существовать:

statements[i].target.contextActivities

Последняя часть этого будет существовать в statements[i].context когда это существует, что не всегда, если вы не знаете утверждение заранее. Практически все свойства должны быть проверены на null прежде чем получить к ним доступ, вы сможете удалить блоки try / catch. Сами имена свойств очень стабильны, а библиотека явно присваивает null значения известных свойств. Дополнительно other свойство будет содержать массив операций (когда он заполнен), поэтому вы должны получить к ним доступ по индексу, поэтому contextActivities.other[0].id и т.п.

Для target свойство, вы должны проверить, что это экземпляр определенного класса, так как он может содержать несколько типов объектов (так может actor но они эффективно совпадают). В общем, для этой конкретной задачи вы также можете использовать toString методы, где это возможно, они делают очень похожую работу.

Другие вопросы по тегам