creator 升级到1.7后,http 超时函数无法回调了

控制台有打印以下语句,但是没有进入ontimeout回调函数里面,这块的api是有调整吗
2017-12-05 21:05:22.777323+0800 PB-mobile[30326:2823706] NSURLConnection finished with error - code -1001
Response failed, error buffer: The request timed out.
2017-12-05 21:05:22.790239+0800 PB-mobile[30326:2823428] Task <5ACBF608-95C9-4B62-A3C1-DE12A4A23964>.<0> HTTP load failed (error code: -999 [1:89])
2017-12-05 21:06:23.191536+0800 PB-mobile[30326:2823899] TIC Read Status [4:0x1c0361680]: 1:57
XMLHttpRequest_finalize, 0x10334bdc0 …
XMLHttpRequest_finalize, 0x103453ed0 …

请求的代码如下:
sendRequest : function(path,data,success, error, timeout,time){
if(!data) {
data = {};
}

        var xhr = cc.loader.getXMLHttpRequest();
        xhr.timeout = time ? time : 3000;
        var str = "?";
        for(var k in data){
            if(str != "?"){
                str += "&";
            }
            str += k + "=" + encodeURIComponent(data[k]);
        }

        var requestURL =  HTTP.url + path + str;
        if(path.indexOf('http:')>=0) {
            requestURL = path;
        }
        console.log("RequestURL:" + requestURL);
        xhr.open("GET",requestURL, true);
        if (cc.sys.isNative){
            xhr.setRequestHeader("Accept-Encoding","gzip,deflate","text/html;charset=UTF-8");
        }
        
        xhr.onreadystatechange = function() {
            if(xhr.readyState === 4 && (xhr.status >= 200 && xhr.status < 300)){
                try {
                    console.log(xhr.responseText);
                    var ret = JSON.parse(xhr.responseText);
                     success && success(ret);
                } catch (e) {
                    error && error();
                }
            }
        };

        //超时回调
        xhr.ontimeout = function(event){
            console.log('超时啦' );
            timeout && timeout();
        };
        xhr.onerror = function(event){
            error && error();
        };
        xhr.send();
        return xhr;
    }

是指原生平台吧?

请教下 @dumganhar

我只记得android上才有这个问题。android的问题已经修复了:

https://github.com/cocos-creator/cocos2d-x-lite/pull/1014

iOS上应该不会的,你可以验证一下examplecase里面的network test。

IOS上重现的,1.5.2的版本 超时是在ontime回调的,1.7变成在onerror回调了

1.7 上这块逻辑的确是调整了。超时控制交由HttpClient-apple.mm进行处理。而HttpClient只知道请求是成功还是失败的。所以,当超时或者出错,就都给了onerror回调。

1.7之前是在xmlhttprequest绑定层自己用scheduler做超时检测处理,而实际上并没有去设置HttpClient的超时时间。即目前HttpClient的超时时间是30s,如果开发者通过xhr.timeout设置为50s,那么在30s的时候onerror就会回调了。而onerror的内容其实就是超时。这样也不符合设计。

后续我会调整一下,方法是:

  • 继续用schedule做超时检测,这样对HttpClient的改动最小
  • 超时时间同步设置到HttpClient,但是时间值需要设置比预设值大2s左右,防止onerror先回调。

目前,临时方案,你可以先在onerror中处理异常。

解决问题的 Pull Request:

https://github.com/cocos-creator/cocos2d-x-lite/pull/1018

可以尝试合并这个PR的修改再验证一下。

好的,谢谢