谁能弄清楚如何将其转换为使用诺言。我尝试了几件事,似乎没有用。我从在SharePoint页上运行的某人继承了此代码。问题的一部分是Async:false设置。而且,当我尝试将其设置为true时,功能区工具栏上的所有东西都损坏了,不幸的是,我无权访问功能区代码。
function findChildren(item, ctxT) {
item.children = [];
return jQuery.ajax({
url: String.format("{0}/_api/web/lists(guid'{1}')/items?$filter=TrackingUnderNumber eq '{2}'", ctxT.HttpRoot, SP.Guid._normalizeGuidString$p(ctxT.listName), item.TrackingNumber),
async: false,
method: "GET",
headers: { "accept": "application/json;odata=verbose" },
success: function (data) {
data.d.results.forEach(function (dItem) {
dItem.parent = item;
item.children.push(dItem);
findChildren(dItem, ctxT);
});
}
});
}
我认为他选择使用Async false的部分原因是他想等到整个树加载完毕后再启用功能区上的按钮和功能。但是必须有一种更好的方法来做到这一点。
答案 0 :(得分:0)
很难看到其余的代码,但这可能会起作用:
function getAllChildren(item, ctxT) {
return new Promise((resolve, reject) => {
const getItemsChildren = () => {
item.children = [];
jQuery.ajax({
url: String.format("{0}/_api/web/lists(guid'{1}')/items?$filter=TrackingUnderNumber eq '{2}'", ctxT.HttpRoot, SP.Guid._normalizeGuidString$p(ctxT.listName), item.TrackingNumber),
async: false,
method: "GET",
headers: { "accept": "application/json;odata=verbose" },
success: function (data) {
if (data.d.results.length > 0){
data.d.results.forEach(function (dItem) {
dItem.parent = item;
item.children.push(dItem);
getItemsChildren(dItem, ctxT);
});
} else {
resolve();
}
},
error: (err) => { reject(err); }
});
};
getItemsChildren();
});
}
// then you can do
getAllChildren(item, ctxt).then(() => { /* do something now */ });
// or inside an async function
(async () => {
await getAllChildren(item, ctxt);
// do something now
})
要做出自己的承诺,请执行以下操作:
new Promise((resolve, reject) => {...});
or
reject()`; resolve
和reject
的数据将成为您在.then
中获得的数据因此,如果我打电话给resolve('Promises rock!')
,然后再这样做.then((data) => { console.log(data); })
,那么我会期望看到“ Promise rock!”作为我的控制台日志。
祝你好运!