踩着单车载着猪
踩着单车载着猪
  • 发布:2015-05-20 22:38
  • 更新:2017-08-07 11:08
  • 阅读:4514

ios XMLHttpRequest 总是abort

分类:HTML5+

ios下,某些wifi环境下,XMLHttpRequest总是失败
error: function(xhr, type, errorThrown) 回调中,xhr信息:

[LOG] : readyState:4  
[LOG] : responseText:  
[LOG] : status:0  
[LOG] : X-Requested-With:XMLHttpRequest  
[LOG] : Accept:application/json  
[LOG] : Content-Type:application/x-www-form-urlencoded  
[LOG] : __UUID__:xhr51432131839102

type:abort
errorThrown:

关闭wifi,重新打开又恢复正常。。。望测试下是否BUG。

2015-05-20 22:38 负责人:无 分享
已邀请:
DCloud_UNI_FXY

DCloud_UNI_FXY

贴一下你的代码。
请求的地址能否公开访问?
能否发现规律?任意的url都有此现象,还是只有特定的请求会发生?

踩着单车载着猪

踩着单车载着猪 (作者)

/**  
 * 请求API  
 * @param {String} url  
 * @param {Object} [data]  
 * @param {Function} [success]  
 * @param {Function} [error]  
 * @param {Boolean} [autoWait]  
 */  
function requestAPI() {  
    var args = arguments,  
        argCount = args.length,  

        url = '',  
        data = {},  
        success = null,  
        error = null,  
        autoWait = true;  

    for (var i = 0; i < argCount; i++) {  
        switch (true) {  
            case typeof args[i] == 'string':  
                url = args[i];  
                break;  
            case typeof args[i] == 'object':  
                data = args[i];  
                break;  
            case typeof args[i] == 'function':  
                if (!success) {  
                    success = args[i];  
                } else {  
                    error = args[i];  
                }  
                break;  
            case typeof args[i] == 'boolean':  
                autoWait = args[i];  
                break;  
            default:  
                console.log(args[i]);  
                break;  
        }  
    }  

    url = ~args[0].indexOf('http://') ? url : siteUrl +'Handler/User.ashx?type=' + url;  

    // 显示等待框  
    if(autoWait) plus.nativeUI.showWaiting('请求中...', {padlock : true});  
    $.ajax(url, {  
        data: data,  
        dataType: 'json',  
        type: 'post',  
        timeout: 20000,  
        success: function(data) {  
            // 请求成功  
            if(autoWait) plus.nativeUI.closeWaiting();  
            if (data.status > 0) {  
                success && (success(data));  
            } else {  
                error && (error(data));  
            }  
        },  
        error: function(xhr, type, errorThrown) {  
            console.log(xhr);  
            console.log(type);  
            console.log(errorThrown);  
            if(autoWait) plus.nativeUI.closeWaiting();  
            error && (error({  
                status: 0,  
                msg: '网络错误,请稍后重试'  
            }));  
        }  
    });  
}
// 请求登录  
plus.nativeUI.showWaiting('登录中...');  

var postData = {  
    no: cardno,  
    pwd: pwd==pwdDefault ? '' : pwd,  
    token: pwd==pwdDefault ? cacheData[2] : '',  
    client: plus.device.uuid  
}  
/*  
console.log('login-----------------------');  
console.log(postData.no);  
console.log(postData.pwd);  
console.log(postData.token);  
console.log(postData.client);  
*/  

requestAPI('login', postData, function(data) {  
        /*  
        console.log('success-----------------------');  
        console.log(data.status);  
        console.log(data.msg);  
        console.log(data.token);  
        */  
        // 记录登录信息  
        cacheData[0] = cardno;  
        if($rember.checked) {  
            cacheData[1] = pwdDefault;  
            cacheData[2] = data.token;  
        }else{  
            cacheData[1] = '';  
            cacheData[2] = '';  
        }  
        //console.log($rember.checked +' : '+ cacheData.join(' - '));  
        plus.storage.setItem(cahceKey, cacheData.join(cacheSplit));  

        // 进入首页  
        plus.webview.create('index.html', 'index');  
    }, function(data) {  
        plus.nativeUI.closeWaiting();  
        /*  
        console.log('error-----------------------');  
        console.log(data.status);  
        console.log(data.msg);  
        console.log(data.token);  
        */  

        if(data.status==-1) {  
            $pwd.value = '';  
            $.toast('登录失败,请输入密码重试');  

            cacheData[1] = '';  
            cacheData[2] = '';  
            plus.storage.setItem(cahceKey, cacheData.join(cacheSplit));  
        }else{  
            $.toast(data.msg);  
        }  
    }, false);
  • DCloud_UNI_FXY

    单看代码看不出不妥,是否可以用多台ios设备在多个wifi环境测试,看看是某台ios设备或某wifi的问题。还是均会发生此现象

    2015-05-23 21:55

  • 踩着单车载着猪 (作者)

    已经测试过了,很容易重现,但是重现又没有规律,多台设备,多个不同的wifi环境

    2015-05-23 21:56

  • 踩着单车载着猪 (作者)

    这是首页,app一打开就显示的登陆页,有时候是真机调试刚启动,有时候又是从后台切换过来

    2015-05-23 22:02

踩着单车载着猪

踩着单车载着猪 (作者)

没人遇到这问题吗。。。还是就我比较奇葩。。。很经常遇到啊···

  • DCloud_UNI_FXY

    android上没这个问题?ios的模拟器有问题没有?3g,4g也都没问题?

    另外你用最新版本mui试试。如果你的登陆页面是在本地的话,xhr不再使用plus的xhr。

    我看你题目里的日志,似乎使用的还是plus的xhr

    2015-05-24 15:07

  • 踩着单车载着猪 (作者)

    回复 DCloud_UNI_FXY:测试了下,是使用window.XMLHttpRequest...可是为什么会这样呃···

    2015-05-24 16:18

  • DCloud_UNI_FXY

    你是说使用window.XMLHttpRequest导致的abort?那换成plus的呢。

    2015-05-24 17:00

蔡繁荣

蔡繁荣 - 发表是最好的记忆

同问,特别wifi环境改变后,无论怎么杀掉进程重启,都是abort

  • DCloud_UNI_FXY

    你的是webview集成?

    2015-06-18 22:50

  • 蔡繁荣

    回复 DCloud_UNI_FXY: 是webview的

    2015-06-19 09:23

  • DCloud_UNI_FXY

    回复 蔡繁荣:我记得回复过你,使用plus的xhr。也一样会遇到wifi切换发生abort?

    2015-06-20 06:51

  • 蔡繁荣

    回复 DCloud_UNI_FXY: 我使用的是mui.ajax,很经常出现abort

    2015-06-20 10:10

  • DCloud_UNI_FXY

    临时解决方案:mui.ajaxSettings.xhr=function(){return new plus.net.XMLHttpRequest();}

    2015-06-20 14:53

  • 1***@qq.com

    回复 DCloud_UNI_FXY: 尝试了这种方法 并没有解决 , 使用代理抓包 接口返回数据是正常的 状态码是200 。 xhr.readyState = 4 , status = 0

    2017-06-23 15:04

1***@qq.com

1***@qq.com

遇到了同样的问题,使用网络工具抓包响应数据时正常的 , 请问楼主解决了嘛?

t***@163.com

t***@163.com

这个问题后来解决了吗,今天上午也遇到了这种情况,majax请求触发了error,但Charles抓包的数据全是正常的,希望官网人员能给够回复。

该问题目前已经被锁定, 无法添加新回复