XMLHttpRequest timeout超时在App平台无效 如何解决

  • Creator 版本:

  • 目标平台:

  • 重现方式:

  • 首个报错:

  • 之前哪个版本是正常的:

  • 手机型号:

  • 手机浏览器:

  • 编辑器操作系统:

  • 重现概率:

HTTP请求代码贴图

Chrome平台是有效的正常

模拟器平台设置timeout无效 超时时间与设置的也对不上

真机Android平台直接就没有超时了

请问应该怎么解决呢?另外官方没有提供Http工具嘛?3.6的文档有看到 Network 这个网络工具函数,但是如何使用啊 直接Editor.Network.post编译不过呀,另外这个POST请求如何设置Header以及超时呢?

namespace Http {

    const RETRY: number = 5;//失败重试次数
    const TIMEOUT: number = 3000;//超时时间(毫秒)

    export enum Method {
        GET = 'GET',
        POST = 'POST'
    }

    export type Config = {
        method?: Method;
        responseType?: XMLHttpRequestResponseType;
    }



    export function send(url: string, data?: Document | XMLHttpRequestBodyInit, config?: Config): Promise<any> {

        const promise: Promise<any> = new Promise((resolve, reject) => {
            var timeoutKey: number;
            var retry = RETRY;
            const send = () => {
                const httpRequest = new XMLHttpRequest();
                const method: Method = config ? config.method || Method.GET : Method.GET;
                const responseType: XMLHttpRequestResponseType = config ? config.responseType : null;
                responseType && (httpRequest.responseType = responseType);

                // httpRequest.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
                httpRequest.onreadystatechange = (event: Event): void => {
                    const readyState = httpRequest.readyState;
                    if (readyState !== 4) return;
                    if (!timeoutKey) return;//已通知超时,之后收到数据后也不处理
                    clearTimeout(timeoutKey);
                    timeoutKey = null;
                    const requestStatus = httpRequest.status;
                    if (requestStatus >= 200 && requestStatus < 400) {
                        resolve(httpRequest.response);
                    }
                    else if (retry-- > 0) send();
                    else reject(new Error());
                }

                httpRequest.open(method, url, true);
                data ? httpRequest.send(data) : httpRequest.send();
                timeoutKey = setTimeout(() => {
                    timeoutKey = null;
                    httpRequest.abort();
                    reject(new Error(`Timeout`));
                }, TIMEOUT);
            }
            send();
        })
        return promise;
    }
}
export default Http;
1赞

谢谢大佬 :kissing_smiling_eyes:

我遇到的是在安卓上使用第三方SDK登录完后,立即调用游戏登录接口,此时容易秒超时!
解决方法:SDK登录完成后,延迟1秒再调用游戏登录,之后就没怎么超时了.