for 循環中發起多個 AJAX 請求,因異步非阻塞導致請求近乎並發,服務器端處理不過來或會話衝突,造成部分請求失敗。加 alert 變同步後反而成功。
原回答給出的 setInterval 方案存在變量作用域、索引管理混亂、難以異常處理等問題,不推薦。
async function allAddRoles(users) {
for (const user of users) {
try {
const sendData = nui.encode({
userid: user.OPERATOR_ID,
prPartId: plPartId3
});
const text = await nui.ajax({
url: "com.spinsoft.eip.portal.Part.queryalladdusers.biz.ext",
type: 'POST',
data: sendData,
cache: false,
contentType: 'text/json'
});
const result = nui.decode(text);
if (result.exception) {
nui.alert("添加角色授權失敗: " + result.exception);
// 可選:break 或 continue
}
} catch (err) {
nui.alert("網絡異常: " + err.message);
}
// 可選:人為延遲 200ms 緩解服務器壓力
await new Promise(r => setTimeout(r, 200));
}
partid3.reload();
partid4.reload();
}
// 調用
const rows = partid3.getSelecteds();
allAddRoles(rows);
function sequentialAjax(users, index = 0) {
if (index >= users.length) return Promise.resolve();
const user = users[index];
return nui.ajax({ ... }).then(text => {
// 處理結果
return sequentialAjax(users, index + 1);
});
}
若允許一定併發(如 3 個並行),可使用 p-limit 庫或自寫信號量池,兼顧吞吐與穩定。