我仍在努力获得在Visual Web部件上工作的延迟承诺链。最终目标是将某些DIV标签的颜色更改为SPList中引用的颜色。检索SP列表数据推迟承诺
我本来这段代码有一个请求,从列表中查找数据的工作,但现在我正在寻找请求的链条。首先是从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());
}
);
}
我想写可重用的代码,但是这让我感到这使得它更难使用延迟方法,如。那么()
我有一个函数来获取从SharePoint列表中的数据时,领悟SPList再次就同一主题是可重复使用:
//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全局列表集合对象。这太可怕了,我讨厌这个,一直试图去除它,但迄今为止失败。它确实有效,并且在阅读,阅读和阅读时,有人建议不能通过延迟方法返回对象,并且必须链接以传递数据。这再次使我能够拥有可重用的代码。
那些'.done()的第二个参数'方法似乎是错误处理,但是这不是如何'.done()'起作用。当然,你可以用这种方式指定额外的处理程序,但它们全都是成功处理程序,而不是错误处理程序 - 并且全部都将接受完全相同的参数列表 - 与承诺解决的值/对象。 –
'var collMenuListItem = collListItem [colkey];','var collBarListItem = collListItem [colkey];'''var collSelectionMenuAssignemntListItem = collListItem [colkey];'是多余的。而'collMenuListItem','collBarListItem'和'collSelectionMenuAssignemntListItem'稍后在各自的外部函数中使用,所有都是内部函数的形式变量,因此与之前声明的变量不同。 –
谢谢甜菜根 - 甜菜根。是的,你对.done()的权利,我试图交换他们,因为你可以看到我意外地得到了一个.done()和一个.then()。我仍然无法通过阅读和再次阅读定义来找出差异。我也看过他们是可以互换的,这是错误的,因为就像你说官方文件给他们不同的论点。 –