CSOM Javascript – beim Ausführen einer Abfrage für mehrere Listen wird eine Fehlermeldung angezeigt – SharePoint 2010
-
28-09-2020 - |
Frage
Gibt es hier einen SharePoint-Experten, der mir helfen kann herauszufinden, warum ich bei Listenabfragen Fehlermeldungen erhalte?
Ich versuche, Daten asynchron aus mehreren Listen abzurufen, erhalte jedoch die folgende Fehlermeldung: The collection has not been initialized. It has not been requested or the request has not been executed. It may need to be explicitly requested.
Mein Code sieht so aus:
function loadAllData() {
loadTeam();
loadTasks();
loadTaskTypes();
}
Wo Ladefunktionen so aussehen:
function loadTeam() {
retrieveListItemsInclude(teamListProperties);
}
function loadTasks() {
retrieveListItemsInclude(tasksListProperties);
}
...
Und retrieveListItemsInclude
Funktion sieht so aus:
function retrieveListItemsInclude(listProperties) {
var clientContext = new SP.ClientContext.get_current();
var oList = clientContext.get_web().get_lists().getByTitle(listProperties.listName);
var camlQuery = new SP.CamlQuery();
camlQuery.set_viewXml('<View><RowLimit>1000</RowLimit></View>');
this.collListItem = oList.getItems(camlQuery);
var includeListProperties = buildInclude(listProperties);
clientContext.load(collListItem, 'Include(Title,ID)');
switch(listProperties.listName) {
case 'Task list':
clientContext.executeQueryAsync(function(){ onTaskQuerySucceeded(listProperties); }, failCallback);
break;
case 'Task types list':
clientContext.executeQueryAsync(function(){ onTaskTypesQuerySucceeded(listProperties); }, failCallback);
break;
...
case 'Team list':
clientContext.executeQueryAsync(function(){ onTeamQuerySucceeded(listProperties); }, failCallback);
break;
}
}
Und schließlich sehen Erfolgsrückrufe so aus:
function onTasksQuerySucceeded(listProperties) {
var tasks = [];
var listItemEnumerator = collListItem.getEnumerator();
while (listItemEnumerator.moveNext()) {
var oListItem = listItemEnumerator.get_current();
var task = {};
task.id = oListItem.get_item('ID');
task.title = oListItem.get_item('Title');
tasks.push(task);
}
console.log("Tasks loaded.");
}
Beim Laufen loadAllData()
Funktion, ich erhalte beim Aufruf die obige Fehlermeldung collListItem.getEnumerator()
in allen Erfolgsrückrufen, aber dem letzten.
Das heißt, wenn ich anrufe loadTeam(); loadTasks(); loadTaskTypes();
In loadAllData()
, ich erhalte in den ersten beiden Erfolgsrückrufen eine Fehlermeldung, aber loadTaskTypes()
wird ordnungsgemäß ausgeführt.
Warum passiert das?In retrieveListItemsInclude(listProperties)
, ich erstelle lokal clientContext
für jede Anfrage an die SharePoint-Liste...Warum stören die Anrufe?
Wenn ich jQuery verwende, verspricht es, Aufrufe zu verketten loadTeam(); loadTasks(); loadTaskTypes();
nacheinander, alle Daten wurden fehlerfrei geladen.
Ich bin für jede Hilfe dankbar.
Lösung
Sehr nah dran, aber Ihr Problem liegt immer noch in JavaScript-Bereichen :) ...speziell:
this.collListItem = oList.getItems(camlQuery);
Wenn der erfolgreiche Rückruf erfolgt, sind die Referenzen durcheinander geraten, da der zweite Funktionsaufruf das colListItem (das sich im globalen Bereich befindet) vom ersten Aufruf überschrieben hat.
Da Sie listProperties bereits als eindeutige Variable verwenden, können Sie diese weiter nutzen.Ändern Sie die drei Zeilen wie folgt:
listProperties.colListItem = oList.getItems(camlQuery)
var includeListProperties = buildInclude(listProperties);
clientContext.load(listProperties.collListItem, 'Include(Title,ID)');
In Ihrem erfolgreichen Rückruf:
function onTasksQuerySucceeded(listProperties) {
var tasks = [];
var listItemEnumerator = listProperties.collListItem.getEnumerator();
//rest of your code...
}