Dynamics CRM JS 多XMLHttpRequest请求 第二个readystate返回2中断求助
问题排查与解决方案
核心故障根因
第二个XMLHttpRequest卡在readystate=2(已发送请求、收到响应头、未接收响应体)即终止的本质,是未捕获的JS同步运行时错误直接中断了XHR的异步状态流转——JS执行上下文一旦抛出未处理的错误,会直接终止当前回调的执行,XHR也就不会再触发后续readystate=3/4的回调流程,表现为请求无理由中断。
已定位的代码硬伤
- 请求队列混入无效值
构造请求队列时,误把XMLHttpRequest.open方法的异步标识参数true,写到了requestURLs.push()的传入参数中。JS的Array.push会把所有传入参数都作为数组元素存储,最终数组结构完全不符合预期:
两个push调用都多带了尾参true,导致数组里交替存储了有效URL和布尔值true。当第一个请求处理完成,current自增到1时,取出的requestURLs[1]的值是布尔值true而非URL,此时req.open("GET", true)会传入无效请求地址,浏览器直接终止请求,完全匹配观察到的readystate=2中断现象。 - 响应处理分支的引用错误
状态横幅的处理逻辑存在多处未定义变量引用:- 把前面解析响应生成的变量
result错写为results(单复数不匹配,直接触发ReferenceError) - 凭空使用了从未声明的循环变量
i - 对Lookup字段的取值逻辑完全不符合WebAPI返回结构:已开启
odata.include-annotations="*"时,Lookup字段的显示值存储在专属的OData注解属性中,无法通过status[0].name的结构获取
这些错误会在代码进入状态横幅分支时直接抛出,中断XHR的回调流程。
- 把前面解析响应生成的变量
- 逻辑块边界缺失
状态判断的代码未给内层判断补全花括号:如果账户状态值为"Open",Notif变量不会被赋值为有效字符串,后续调用setFormNotification时会传入undefined,再次触发JS错误。
修复落地步骤
- 修正请求队列构造逻辑
删掉两个push调用里多余的尾参true,保证数组内仅存储有效的请求URL字符串。 - 重写状态横幅的响应处理逻辑
替换错误的变量引用,采用符合WebAPI返回结构的取值方式,补全变量声明:else if (current == 1) { // 从OData注解中直接获取Lookup字段的显示名 const statusName = result.value[0]["_new_statusLookup_value@OData.Community.Display.V1.FormattedValue"]; if (statusName && statusName !== "Open") { const Notif = `The status for the organisation on this case is ${statusName}.`; formContext.ui.setFormNotification(Notif, "INFO", "Notif2"); } } - 增加容错保护
给onreadystatechange内的响应处理逻辑包一层try-catch,避免单个分支的错误中断整个请求队列;将current自增、队列递归发起下一个请求的逻辑移到try-catch块外,保证哪怕单个请求的响应处理出错,后续请求也能正常触发。 - 快速验证路径
打开浏览器开发者工具的控制台面板,触发表单通知函数时实时观察抛出的运行时错误;在req.open调用前打印当前待请求的URL值,确认无无效字符串混入队列。
内容的提问来源于stack exchange,提问作者SmallerMe
相关产品推荐
相关产品推荐

