5

ExtJS 4.1 を使用していますが、タイムアウトが発生すると Google Chrome で例外がキャッチされません。

Ext.Ajax.timeout = 10000; // 10 seconds
Ext.Ajax.method = "GET";
Ext.Ajax.request({
    url:'rest/dataloggerset.json',
    params:{
           sessionGuid:Ext.getStore("User").getAt(0).get("sessionGuid"),
            loggerId:this.availableLogFiles.loggerId,
            logSet:this.currentLog
    },
    success:this.processReceivedLogData,
    failure:this.failureDuringResourceLoad,
    scope:this
});

要求はタイムアウトで終了し、これまでに受信したデータをオブジェクトで解析しようとします。したがって、開発者コンソールに表示されるキャッチされていない例外は次のようになります。

キャッチされないエラー: INVALID_STATE_ERR: DOM 例外 11 Connection.js:914 Ext.define.createResponse Connection.js:914 Ext.define.onComplete Connection.js:859 Ext.define.abort Connection.js:767 request.timeout

この問題は FF では発生しません。例外がキャッチされていないため、私のメソッド failureDuringResourceLoad は呼び出されません。

言及する価値があるかもしれませんが、定義されたタイムアウトが経過してもデータはまだ送信されています。

何か案は?

4

1 に答える 1

3

いくつかの調査の後、xhr.abort() の動作が Chrome と FF で異なることがわかりました。Chrome では xhr.status は変更されず 200 のままですが、FF のステータスは xhr.abort() の呼び出し後に 0 に設定されます。

この違いにより、ExtJS 4.1 では、タイムアウト リクエストが有効なレスポンスと誤解されるという影響が生じます。タイムアウトのシナリオを処理するために、次のオーバーライドを使用しました。ExtJS 4.1 では、タイムアウトが発生したかどうかをリクエスト オブジェクトの変数がマークします。オーバーライドは onComplete メソッドを置き換えます。

Ext.define('Df.data.Connection', {
    override: 'Ext.data.Connection',

    onComplete : function(request) {
        var me = this,
            options = request.options,
            result,
            success,
            response;

        try {
            result = me.parseStatus(request.xhr.status);
        } catch (e) {
            // in some browsers we can't access the status if the readyState is not 4, so the request has failed
            result = {
                success : false,
                isException : false
            };
        }

        success = result.success && !request.timedout;

        if (success) {
            response = me.createResponse(request);
            me.fireEvent('requestcomplete', me, response, options);
            Ext.callback(options.success, options.scope, [response, options]);
        } else {
            if (result.isException || request.aborted || request.timedout) {
            response = me.createException(request);
            } else {
                response = me.createResponse(request);
            }
            me.fireEvent('requestexception', me, response, options);
            Ext.callback(options.failure, options.scope, [response, options]);
        }
        Ext.callback(options.callback, options.scope, [options, success, response]);
        delete me.requests[request.id];
        return response;
    }
});

この変更は、Connection.js の元の場所の 856 行にあります。延長しました

success = result.success;

に :

success = result.success && !request.timedout;

この問題を解決するためのより便利な方法があれば教えてください!

于 2012-11-20T15:20:30.117 に答える