SharePoint 列表中的大型列表检索在工作前失败 4-10 次 (JavaScript)
Large list retrieval in SharePoint list failing 4-10 times before working (JavaScript)
我需要在列表之间复制项目(向每个项目添加更多内容,因此无法使用流),我遇到了一个错误,如果源列表大于 100 个项目,脚本将在查询到源时终止列表(点击按钮时首先发生的事情),大约 4-10 次,然后它就可以工作了。
我正在使用承诺来确保一切按顺序发生,但这似乎不是问题,而是在承诺结构的第一步中查询失败。
它不是查询中的行限制,因为它设置为 1000,行数约为 200。
这是一个示例代码,它适用于少量项目,但当两个列表包含大约 100 个项目时需要多个 运行:
<head>
<script
src="https://code.jquery.com/jquery-3.3.1.js"
integrity="sha256-2Kok7MbOyxpgUVvAk/HJ2jigOSYS2auK4Pfzbm7uH60="
crossorigin="anonymous"></script>
<script>
function update() {
console.log("1")
var dfd = $.Deferred(function () {
var updateBtnCLientContextForSourceList =
new SP.ClientContext.get_current();
var getSourceList = updateBtnCLientContextForSourceList
.get_web()
.get_lists()
.getByTitle("SourceList");
var camlQueryForSourceList = new SP.CamlQuery();
camlQueryForSourceList.set_viewXml('<View><Query><Where><Geq><FieldRef Name=\'ID\'/>' +
'<Value Type=\'Number\'>1</Value></Geq></Where></Query><RowLimit>4000</RowLimit></View>');
var SourceListtStore = getSourceList.getItems(camlQueryForSourceList);
updateBtnCLientContextForSourceList.load(SourceListtStore);
updateBtnCLientContextForSourceList.executeQueryAsync(
function () {
dfd.resolve(SourceListtStore);
},
function (sender, args) {
dfd.reject(args);
}
);
});
console.log("2")
return dfd.promise();
}
acadcount = 0;
function check() {
update()
.then(
function (SourceListtStore) {
console.log("3")
acadcount = SourceListtStore.get_count()
console.log("4")
var dfd = $.Deferred(
function () {
var updateBtnCLientContextForWeeksAllocated =
SP.ClientContext.get_current();
var getWeeksAllocated =
updateBtnCLientContextForWeeksAllocated
.get_web()
.get_lists()
.getByTitle("Weeks Allocated");
var camlQueryForWeeksAllocated = new SP.CamlQuery();
camlQueryForWeeksAllocated.set_viewXml('<View><Query><Where><Geq><FieldRef Name=\'ID\'/>' +
'<Value Type=\'Number\'>1</Value></Geq></Where></Query><RowLimit>1000</RowLimit></View>');
var weeksAllocatedListStore =
getWeeksAllocated.getItems(camlQueryForWeeksAllocated);
updateBtnCLientContextForWeeksAllocated.load(weeksAllocatedListStore);
updateBtnCLientContextForWeeksAllocated.executeQueryAsync(
function () {
dfd.resolve(weeksAllocatedListStore);
},
function (sender, args) {
dfd.reject(args);
}
);
}
);
console.log("5")
return dfd.promise()
}
).then(
function (waListStore) {
console.log("6")
if (waListStore.get_count() === acadcount) {
console.log("7")
alert("All items have been copied")
}
else {
console.log("8")
alert("Please try again")
}
}
);
}
</script>
</head>
<body>
<button onClick="check()">Check</button>
</body>
stage 2=就在源列表查询结果的return之前
阶段 5=就在周分配列表查询的 return 之前
结果
源列表:2 项,周 allocated:3 项
- 第一和第二 运行:最多 8 个(已完成)
来源列表:109 项,周 allocated:1 项
第一个运行:最多2
2,3: 最多 5
4:最多 2
5-8:最多 5
9:最多 8 个(已完成)
来源 list:109 项,周 allocated:100 项
前 33 运行 秒:最多 5
34:最多8个(已完成)
所以我假设脚本失败时 promise.return 在 .resolve 完成之前 运行ning 是正确的吗?如果可以,我该如何解决这个问题?
页面在 JS 有机会完全执行大量项目之前重新加载,禁用了按钮点击刷新,现在工作正常。
我需要在列表之间复制项目(向每个项目添加更多内容,因此无法使用流),我遇到了一个错误,如果源列表大于 100 个项目,脚本将在查询到源时终止列表(点击按钮时首先发生的事情),大约 4-10 次,然后它就可以工作了。
我正在使用承诺来确保一切按顺序发生,但这似乎不是问题,而是在承诺结构的第一步中查询失败。
它不是查询中的行限制,因为它设置为 1000,行数约为 200。
这是一个示例代码,它适用于少量项目,但当两个列表包含大约 100 个项目时需要多个 运行:
<head>
<script
src="https://code.jquery.com/jquery-3.3.1.js"
integrity="sha256-2Kok7MbOyxpgUVvAk/HJ2jigOSYS2auK4Pfzbm7uH60="
crossorigin="anonymous"></script>
<script>
function update() {
console.log("1")
var dfd = $.Deferred(function () {
var updateBtnCLientContextForSourceList =
new SP.ClientContext.get_current();
var getSourceList = updateBtnCLientContextForSourceList
.get_web()
.get_lists()
.getByTitle("SourceList");
var camlQueryForSourceList = new SP.CamlQuery();
camlQueryForSourceList.set_viewXml('<View><Query><Where><Geq><FieldRef Name=\'ID\'/>' +
'<Value Type=\'Number\'>1</Value></Geq></Where></Query><RowLimit>4000</RowLimit></View>');
var SourceListtStore = getSourceList.getItems(camlQueryForSourceList);
updateBtnCLientContextForSourceList.load(SourceListtStore);
updateBtnCLientContextForSourceList.executeQueryAsync(
function () {
dfd.resolve(SourceListtStore);
},
function (sender, args) {
dfd.reject(args);
}
);
});
console.log("2")
return dfd.promise();
}
acadcount = 0;
function check() {
update()
.then(
function (SourceListtStore) {
console.log("3")
acadcount = SourceListtStore.get_count()
console.log("4")
var dfd = $.Deferred(
function () {
var updateBtnCLientContextForWeeksAllocated =
SP.ClientContext.get_current();
var getWeeksAllocated =
updateBtnCLientContextForWeeksAllocated
.get_web()
.get_lists()
.getByTitle("Weeks Allocated");
var camlQueryForWeeksAllocated = new SP.CamlQuery();
camlQueryForWeeksAllocated.set_viewXml('<View><Query><Where><Geq><FieldRef Name=\'ID\'/>' +
'<Value Type=\'Number\'>1</Value></Geq></Where></Query><RowLimit>1000</RowLimit></View>');
var weeksAllocatedListStore =
getWeeksAllocated.getItems(camlQueryForWeeksAllocated);
updateBtnCLientContextForWeeksAllocated.load(weeksAllocatedListStore);
updateBtnCLientContextForWeeksAllocated.executeQueryAsync(
function () {
dfd.resolve(weeksAllocatedListStore);
},
function (sender, args) {
dfd.reject(args);
}
);
}
);
console.log("5")
return dfd.promise()
}
).then(
function (waListStore) {
console.log("6")
if (waListStore.get_count() === acadcount) {
console.log("7")
alert("All items have been copied")
}
else {
console.log("8")
alert("Please try again")
}
}
);
}
</script>
</head>
<body>
<button onClick="check()">Check</button>
</body>
stage 2=就在源列表查询结果的return之前
阶段 5=就在周分配列表查询的 return 之前
结果
源列表:2 项,周 allocated:3 项
- 第一和第二 运行:最多 8 个(已完成)
来源列表:109 项,周 allocated:1 项
第一个运行:最多2
2,3: 最多 5
4:最多 2
5-8:最多 5
9:最多 8 个(已完成)
来源 list:109 项,周 allocated:100 项
前 33 运行 秒:最多 5
34:最多8个(已完成)
所以我假设脚本失败时 promise.return 在 .resolve 完成之前 运行ning 是正确的吗?如果可以,我该如何解决这个问题?
页面在 JS 有机会完全执行大量项目之前重新加载,禁用了按钮点击刷新,现在工作正常。