2017-03-20 3 views
0

Ich habe ein Skript, das zu 90% abgeschlossen ist und funktioniert. Ich verwende den älteren Code zum Abrufen von LRS-Anweisungen. Es ist derjenige, der tincan.js verwendet. Ich versuche, herunterzuziehen und analysieren die folgenden: Schauspieler, Verb, Objekt, Zeitstempel und die ID unter contextActivities. Es ist der letzte, der mich fit macht. Könntest du dir bitte meine letzte Fang-/Versuchserklärung ansehen und mir sagen, wo ich falsch liege? Vielen Dank.Versuchen, bestimmte Daten Teile eines LRS-Datensatzes zu ziehen, müssen versuchen-versuchen Hilfe

<!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> 

Antwort

0

Sie versuchen, eine Eigenschaft zuzugreifen, die es nie geben wird:

statements[i].target.contextActivities

Der letzte Teil des in statements[i].context existieren, wenn es vorhanden ist, was nicht immer ist, wenn Sie die Anweisung kennen vor der Zeit. So ziemlich alle Eigenschaften sollten vor dem Zugriff auf null überprüft werden, damit Sie Ihre try/catch-Blöcke entfernen können. Die Eigenschaftsnamen selbst sind sehr stabil und die Bibliothek weist bekannten Eigenschaften explizit null Werte zu. Zusätzlich wird die other Eigenschaft wird eine Reihe von Aktivitäten halten (wenn es gefüllt ist), so dass Sie sollten sie durch den Index zugreifen, so contextActivities.other[0].id usw.

Für die target Eigenschaft sollten Sie prüfen, ob es sich um eine Instanz einer bestimmten Klasse, wie es ist kann mehrere Arten von Objekten enthalten (so kann actor aber sie effektiv übereinstimmen). Im Allgemeinen für diese spezielle Aufgabe möchten Sie vielleicht auch die toString Methoden wo möglich, sie arbeiten sehr ähnliche Arbeit.

+0

Vielen Dank. Ich werde es versuchen. –

Verwandte Themen