CSOM Javascript — при выполнении запроса к нескольким спискам возникает ошибка — SharePoint 2010
-
28-09-2020 - |
Вопрос
Есть ли здесь какой-нибудь эксперт по SharePoint, который может помочь мне выяснить, почему я получаю ошибку при запросах списков?
Я пытаюсь асинхронно получить данные из нескольких списков, но получаю следующую ошибку: 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.
Мой код выглядит следующим образом:
function loadAllData() {
loadTeam();
loadTasks();
loadTaskTypes();
}
Где функции загрузки выглядят так:
function loadTeam() {
retrieveListItemsInclude(teamListProperties);
}
function loadTasks() {
retrieveListItemsInclude(tasksListProperties);
}
...
И retrieveListItemsInclude
функция выглядит так:
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;
}
}
И, наконец, обратные вызовы успеха выглядят так:
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.");
}
При беге loadAllData()
функция, я получаю ошибку выше при вызове collListItem.getEnumerator()
во всех успешных обратных вызовах, кроме последнего.
Это значит, что если я позвоню loadTeam(); loadTasks(); loadTaskTypes();
в loadAllData()
, я получаю сообщение об ошибке в первых двух успешных обратных вызовах, но loadTaskTypes()
будет выполняться правильно.
Почему это происходит?В retrieveListItemsInclude(listProperties)
, я создаю локальный clientContext
для каждого запроса к списку SharePoint...почему звонки мешают?
Когда я использовал обещания jQuery для объединения вызовов в цепочку loadTeam(); loadTasks(); loadTaskTypes();
друг за другом все данные загружаются без ошибок.
Я ценю любую помощь.
Решение
Очень близко, но ваша проблема все еще в области JavaScript :) ...конкретно:
this.collListItem = oList.getItems(camlQuery);
Когда приходит успешный обратный вызов, ссылки перепутались, потому что второй вызов функции переопределил colListItem (который находится в глобальной области видимости) из первого вызова.
Поскольку вы уже используете listProperties как уникальную переменную, вы можете использовать ее дальше.Измените эти три строки на следующие:
listProperties.colListItem = oList.getItems(camlQuery)
var includeListProperties = buildInclude(listProperties);
clientContext.load(listProperties.collListItem, 'Include(Title,ID)');
Внутри вашего успеха перезвоните:
function onTasksQuerySucceeded(listProperties) {
var tasks = [];
var listItemEnumerator = listProperties.collListItem.getEnumerator();
//rest of your code...
}