首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JavaScript for 循環中順序執行異步 AJAX 請求的正確模式

     編輯:程式設計綜合問答

問題現象

for 循環中發起多個 AJAX 請求,因異步非阻塞導致請求近乎並發,服務器端處理不過來或會話衝突,造成部分請求失敗。加 alert 變同步後反而成功。

錯誤嘗試:setInterval 輪詢

原回答給出的 setInterval 方案存在變量作用域、索引管理混亂、難以異常處理等問題,不推薦。

現代最佳實踐:async/await + for...of

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);

舊環境兼容方案:Promise 鏈 / 遞歸

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 庫或自寫信號量池,兼顧吞吐與穩定。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved