检索SP列表数据延迟承诺



我仍在努力让一系列延迟承诺在Visual Web部件上工作。最终目标是将某些DIV标签的颜色更改为SPList中引用的颜色。

我最初使用这段代码处理一个从列表中查找数据的请求,但现在我正在寻找一系列请求。第一个是从window.location.href属性中查找子网站的名称。尽管这段代码检索子站点名称时将其视为输入,但这可能是我的第一个错误,也许我应该从SPWeb对象中获取它。然后,第二个在where子句中使用此值,从对另一个列表的第二次调用中检索正确的数据。

因此,如果有的话,该代码目前可以工作,但是间歇性的。我认为我没有在正确的位置调用.resolve(),如果异步代码在调用线程使用预期结果之前已经完成,那只是运气。因此,它处于处理器之神的掌控之中,可能以50:50的比例工作。这至少证明了我的jQuery代码正在生成所需的结果。

我有两个函数对两个不同的DIV元素执行几乎完全相同的操作。这就是我现在所拥有的。

function alterMenuColour(id) {
getMenuItemfromURLValue(window.location.href).done(function (urlSelection) {
var colkey = 0; //this is the key for the list collection array.  This needs to be uneque for each different call to retrieveListItems.
var promise = retrieveListItems('/sites/OMGIntranet/OMGCentral/', 'MenuItemList', '<View><Query><Where><Eq><FieldRef Name='MenuItem'/><Value Type='Text'>' + urlSelection + '</Value></Eq></Where></Query><RowLimit>1</RowLimit></View>', 'Id,MenuColour,BarColour', colkey);
var collMenuListItem = collListItem[colkey];
promise.done(
function (collMenuListItem) {
var listItemEnumerator = collMenuListItem.getEnumerator();
var oListItem;
while (listItemEnumerator.moveNext()) {
oListItem = listItemEnumerator.get_current();
}
var menus = getChildElementsByType(document, id, 'div');
jQuery(menus).children("div").each(function () {
jQuery(this).css("background", oListItem.get_item('MenuColour'));
});
},
function (sender, args) {
alert('Request failed. ' + args.get_message() + 'n' + args.get_stackTrace());
}
);
});
}
function alterBarColour() {
getMenuItemfromURLValue(window.location.href).done(function (urlSelection) {
var colkey = 1; //this is the key for the list collection array.  This needs to be uneque for each different call to retrieveListItems.
var barpromise = retrieveListItems('/sites/OMGIntranet/OMGCentral/', 'MenuItemList', '<View><Query><Where><Eq><FieldRef Name='MenuItem'/><Value Type='Text'>' + urlSelection + '</Value></Eq></Where></Query><RowLimit>1</RowLimit></View>', 'Id,MenuColour,BarColour', colkey);
var collBarListItem = collListItem[colkey];
barpromise.done(
function (collBarListItem) {
var listItemEnumerator = collBarListItem.getEnumerator();
var oListItem;
while (listItemEnumerator.moveNext()) {
oListItem = listItemEnumerator.get_current();
}
var bar = document.getElementsByClassName('SectionMenuBar');
jQuery(bar).each(function () {
jQuery(this).css("background", oListItem.get_item('BarColour'));
});
},
function (sender, args) {
alert('Request failed. ' + args.get_message() + 'n' + args.get_stackTrace());
}
);
});
}

我已经创建了一个函数getMenuItemfromURLValue(url),如果前面描述过的话,它就是获取子站点名称的方法。

function getMenuItemfromURLValue(url) {
var colkey = 2; //this is the key for the list collection array.  This needs to be uneque for each different call to retrieveListItems.
var promise = retrieveListItems('/sites/OMGIntranet/OMGCentral/', 'SectionMenuAssignmentList', '<View><Query><OrderBy><FieldRef Name='ID'/></OrderBy></Query></View>', 'MenuItemLookup', colkey);
var collSelectionMenuAssignemntListItem = collListItem[colkey];
return promise.then(
function (collSelectionMenuAssignemntListItem) {
var listItemEnumerator = collSelectionMenuAssignemntListItem.getEnumerator();
var oListItem;
while (listItemEnumerator.moveNext()) {
oListItem = listItemEnumerator.get_current();
if (isStringMatch(decodeURI(url), oListItem.get_item('MenuItemLookup').$2d_1)) {
return oListItem.get_item('MenuItemLookup').$2d_1;
}
}
},
function (sender, args) {
alert('Request failed. ' + args.get_message() + 'n' + args.get_stackTrace());
}
);
}

我正在尝试编写可重复使用的代码,但我突然想到,当使用诸如.then()之类的延迟方法时,它会让人更难理解

我有一个从SharePointSPList获取列表数据的功能,它在同一主题上也是可重用的:

//http://www.shillier.com/archive/2013/03/04/using-promises-with-the-javascript-client-object-model-in-sharepoint-2013.aspx
function retrieveListItems(siteUrl, list, calm, include, collkey) {
var deferred = $.Deferred();
var clientContext
if (siteUrl == null) {
clientContext = sharePointCurrentClientContext();
} else {
clientContext = new SP.ClientContext(siteUrl);
}
var oList = clientContext.get_web().get_lists().getByTitle(list);
var camlQuery = new SP.CamlQuery();
camlQuery.set_viewXml(calm);
if (typeof this.collListItem === 'undefined') {
this.collListItem = [];
}
this.collListItem.add(collkey, oList.getItems(camlQuery));
if (include == null) {
clientContext.load(collListItem[collkey]);
} else {
clientContext.load(collListItem[collkey], 'Include(' + include + ')');
}
clientContext.executeQueryAsync(Function.createDelegate(this, function () { deferred.resolve(collListItem[collkey]) }), Function.createDelegate(this, function (sender, args) { deferred.reject(sender, args); }));
return deferred.promise();
}

最初,当我编写这个函数时,唯一能弄清楚如何成功返回数据的方法是在一个名为collListItem的全局列表集合对象中。这太可怕了,我讨厌这个,一直试图删除它,但到目前为止没有成功。尽管如此,它确实有效,而且在读了又读又读之后,一些人认为对象不能通过延迟方法返回,必须将它们链接起来才能传递数据。这再次让我回到了能够使用可重用代码的状态。

我现在已经让它100%工作,这是我的目标,但我仍然对它不满意——它似乎不是一个优雅的代码,我仍然对这个概念感到困惑。

我变了,

function alterMenuColour(id) {
-    getMenuItemfromURLValue(window.location.href).done(function (urlSelection) {
+    getMenuItemfromURLValue(window.location.href, 3).done(function (urlSelection) {

function alterBarColour() {
-    getMenuItemfromURLValue(window.location.href).done(function (urlSelection) {
+    getMenuItemfromURLValue(window.location.href, 4).done(function (urlSelection) {

-function getMenuItemfromURLValue(url) {
-
-    var colkey = 2; //this is the key for the list collection array.  This needs to be uneque     for each different call to retrieveListItems.
+function getMenuItemfromURLValue(url, colkey) {

最新更新