2017-10-08 5 views
1

Mit dem Office-JavaScript-API, Ich versuche, eine ausgewählte Tabelle mit dem folgenden Code zu füllen:MS Word API: Stellen Sie Tabellenwerte geladen async

Word.run(function (context) { 

    var table = context.document.getSelection().parentTable;  
    table.load("values, rows/items/cells/items/body");  
    context.trackedObjects.add(table); 

    return context.sync().then(function() { 
     // loop over table 
     for (var row = 0; row < table.values.length; row++) { 
      for (var column = 0; column < table.values[row].length; column++) { 
       // use closures to keep cell index variables for ajax 
       (function (row, column, table, context) { 
        if ((table.values[row][column].trim() == 
          "" || !table.values[row][column]) && 
         table.values[row][0] && table.values[0][column]) { 

         $.ajax({ 
          url: "https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/name/" + 
           table.values[row][0].replace(/\s/g, '') + 
           "/property/" + table.values[0][column] + "/txt" 
         }).done(function (data) { 

          // insert data 
          table.rows.items[row].cells.items[column].body.insertText(data); 
          console.log("data: " + data); 

          return context.sync().then(function() { 
           console.log("synced"); 
          }).catch(function (e) { 
           console.log("0"); 
           errorHandler(e); 
          }); 

         }).error(function (e) { 
          console.log("1"); 
          errorHandler(e); 
         }); 
        } else { 
         console.log(row + " " + column + " not beeing set, it is " + 
          table.values[row][column]); 
        } 
       })(row, column, table, context); 
      } 
     } 
    }).then(context.sync().then(
     function() { 
      console.log("last sync?"); 
     } 
    ).catch(function (e) { 
     console.log("2"); 
     errorHandler(e); 
    })); 
}).catch(function (e) { 
    console.log("3"); 
    errorHandler(e); 
}); 

Aber irgendwie funktioniert das nicht als eine Ausnahme ausgelöst wird :

ItemNotFound: ItemNotFound 

die Quelle des Fehlers ist - gemäß dem lügt (0) und den Fehler ("errorLocation":"TableRowCollection.getItem") an dem Einsatz-Datenteil.

Wie kann ich Word sagen, dass ich die Tabellenvariable für ein wenig länger behalten soll, da ich den Inhalt aktualisieren werde, sobald mein Ajax fertig ist?

Antwort

1

Der Grund dafür ist, dass Ihre Funktion weiterhin ausgeführt wird (und abgeschlossen ist), während Ihr $.ajax() Aufruf im Hintergrund stattfindet. Sie müssen die Ausführung blockieren, während Ihr ajax() Anruf nicht seine Sache ist.

Sie können dies ein paar Möglichkeiten tun, aber die einfachste könnte einfach async: false in Ihren ajax() Optionen einstellen werden:

$.ajax({ 
    url: "https://pubchem.ncbi.nlm.nih....", 
    async: false 
}).done(function (data) {}); 

Außerdem müssen Sie einen zweiten Parameter zu übergeben (die so genannten insertLocation, wo Sie einfügen möchten der Text) zu body.insertText: entweder 'Replace', 'Start' oder 'End'.