Haxe JS中Http.requestUrl触发InvalidAccessError问题解决问询
Haxe/JS 同步HTTP请求报错解决方案
报错根因:Haxe/JS 标准库的Http实现默认会给所有请求设置responseType属性,但浏览器规范禁止同步模式的XMLHttpRequest设置responseType和timeout属性,因此触发
InvalidAccessError: XMLHttpRequest.responseType setter: synchronous XMLHttpRequests do not support timeout and responseType错误。
以下是可用的解决方案:
优先改用异步请求(官方推荐)
现代浏览器对同步XHR的限制越来越严格,部分场景下甚至会直接拦截同步请求,切换为异步回调模式可以从根本上规避该问题,示例代码如下:var http = new haxe.Http("http://www.anyurl.com"); http.onData = function(response:String) { // 处理请求成功结果 trace(response); }; http.onError = function(err:String) { // 处理请求异常 trace("请求出错:" + err); }; http.request();必须使用同步请求时,手动封装原生XMLHttpRequest
直接调用JS原生接口实现同步请求,绕过Haxe标准库的多余逻辑,示例代码如下:import js.html.XMLHttpRequest; function syncGet(url:String):String { var xhr = XMLHttpRequest.create(); // open方法第三个参数设为false代表同步请求 xhr.open("GET", url, false); xhr.send(); return xhr.responseText; } // 调用示例 var result = syncGet("http://www.anyurl.com");给标准库打补丁兼容同步请求
在应用初始化阶段执行一次如下代码,修改Haxe Http类的内部逻辑,同步请求时跳过responseType设置:// 应用启动入口处执行 untyped __js__(" const originalSend = haxe.http.HttpJs.prototype.send; haxe.http.HttpJs.prototype.send = function(xhr, postData) { if (!this.async) { xhr.send(postData); return; } if (this.responseType != null) xhr.responseType = this.responseType; xhr.send(postData); } ");
内容的提问来源于stack exchange,提问作者ianxm
相关产品推荐
相关产品推荐

