scalajs-react中Ajax GET与DELETE请求回调执行表现不一致问题
问题原因分析
你遇到的DELETE请求onComplete回调不触发、GET请求正常的差异,主要是以下几个原因导致的:
- CORS预检请求未通过
GET属于HTTP简单请求,只要服务端配置了基础跨域头就能正常触发回调;而DELETE属于非简单请求,浏览器会先发起OPTIONS预检请求,验证服务端是否允许跨域访问DELETE接口。如果服务端没有正确处理OPTIONS请求(未返回Access-Control-Allow-Methods: DELETE、Access-Control-Allow-Origin和你前端域名不匹配等),浏览器会直接拦截该请求,不会触发后续的onComplete回调。你可以先打开浏览器控制台的网络标签,确认是否有OPTIONS请求返回了错误状态码。 - 请求头与请求内容不匹配
你给DELETE请求调用了setRequestContentTypeJsonUtf8,会设置Content-Type: application/json; charset=utf-8请求头,但你调用send("")传入的是空字符串,不属于合法JSON格式,部分浏览器或scalajs-react的Ajax底层实现会因为请求内容不符合声明的类型直接终止请求,不会触发完成回调。
修复方案:DELETE请求通常不需要提交请求体,你可以直接删掉setRequestContentTypeJsonUtf8调用即可;如果接口要求必须带JSON请求头,把send("")改成send("{}")即可。 - 服务端响应状态码异常
大部分遵循REST规范的DELETE接口成功后会返回204 No Content状态码,响应体为空,部分旧版本的scalajs-react对204状态的响应处理存在bug,也可能导致回调不触发。你可以在网络标签确认DELETE请求的实际返回状态码,临时改成让服务端DELETE接口返回200测试回调是否能正常触发。 - 代码语法错误
你贴出的DELETE请求代码中,200状态分支的末尾多了一个多余的右括号),如果实际运行代码也存在这个语法问题,会导致编译错误或者运行时异常,提前终止逻辑,也会出现回调不触发的现象。
内容的提问来源于stack exchange,提问作者Mandroid
相关产品推荐
相关产品推荐

