CSOM Javascript — при выполнении запроса к нескольким спискам возникает ошибка — SharePoint 2010

sharepoint.stackexchange https://sharepoint.stackexchange.com/questions/103992

Вопрос

Есть ли здесь какой-нибудь эксперт по 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...
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с sharepoint.stackexchange
scroll top