Это своего рода неловкий вопрос, но я застрял. Мой фон управляется кодом, и я никогда не изучал JavaScript, но все же я хочу реализовать крошечный проект. Сценарий работает в SharePoint 2010, запрашивает элементы из пользовательского списка с использованием объектной модели JavaScript и заполняет диаграмму или таблицу Google соответственно. С помощью MSDN и Google Developer Мне удалось запросить данные из одного списка и визуализировать его.JavaScript code design async/callback
Однако я не могу передать концепцию для запроса нескольких списков, объединить результирующие наборы и, наконец, перейти к API Google. В моем коде я создал цепочку обратных вызовов, например showChart-> loadListData-> drawChart. Это плохой дизайн, поскольку он негибкий и не может быть расширен. Все методы API являются асинхронными и не имеют возвращаемых значений, но ожидают, что имена методов будут вызваны после завершения. Это то, что меня застряло, и где мне не хватает знаний.
Я очень рад за каждый комментарий и ответ, также могу предоставить фактический исходный код, если потребуется. Спасибо заранее, Тоби
UPDATE, как просили на @Utkanos:
var listItems;
$(document).ready(function() {
ExecuteOrDelayUntilScriptLoaded(loadChartData, "sp.js");
});
function loadChartData() {
var camlQuery = SP.CamlQuery.createAllItemsQuery();
camlQuery.set_viewXml("<View><Query><Where><Eq><FieldRef Name='Year'/><Value Type='Text'>2015</Value></Eq></Where></Query></View>");
loadListData('CustomList', camlQuery, drawChart, readListItemFailed);
}
function loadListData(listTitle, camlQuery, onSuccess, onFail) {
context = SP.ClientContext.get_current();
var list = context.get_web().get_lists().getByTitle(listTitle);
var listItems = list.getItems(camlQuery);
context.load(listItems);
context.executeQueryAsync(function(sender, args){onSuccess(listItems);}, onFail);
}
function drawDpOverviewChart(listItems) {
var data;
var enumerator = listItems.getEnumerator();
data = new google.visualization.DataTable();
data.addColumn('string', 'Column1');
data.addColumn('number', 'Column2');
var listItem;
while (enumerator.moveNext()) {
listItem = enumerator.get_current();
data.addRow([listItem.get_item('Title'), Math.round(listItem.get_item('Balance')/10000)/100]);
}
var options = {'title':'Pretty Chart'};
var chart = new google.visualization.PieChart(document.getElementById('chart_div'));
chart.draw(data, options);
}
function readListItemFailed(sender, args) {
alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
}
Пожалуйста, ваши код. – Utkanos
Возможный дубликат [Как подождать набора асинхронных функций обратного вызова?] (Http://stackoverflow.com/questions/10004112/how-can-i-wait-for-set-of-asynchronous-callback-functions) – JJJ
, если у вас есть поля поиска друг к другу, вы можете использовать [REST API] (https://msdn.microsoft.com/en-us/library/ff798339.aspx), чтобы «присоединить» их к одному вызову ... – WhiteHat