Обработка 404 исключений в Sencha Touch Store с помощью ajax-прокси - PullRequest
8 голосов
/ 19 августа 2011

Я пытаюсь сделать мой код немного более устойчивым, обрабатывая всевозможные исключения, которые могут возникнуть. Одним из них может быть исключение 404 в веб-запросе Json. Похоже, что метод обратного вызова store.load не вызывается, когда запрос Json получает исключение 404.

код:

    Ext.regModel('Activiteit', {
    fields: [
        { name: 'id', type: 'int' },
        { name: 'ServerId', type: 'int', mapping: 'Id' },
        { name: 'Title', type: 'string' },
        { name: 'Description', type: 'string' },
    ],
});

Ext.regApplication({
    name: 'App',
    launch: function () {
        console.log('launch');

        var ajaxActiviteitStore = new Ext.data.Store({
            model: "Activiteit",
            storeId: 'ajaxActiviteitStore',
            proxy: {
                type: 'ajax',
                url: '/senchatest/Activiteit/Gett/',
                reader: {
                    type: 'json',
                    root: 'activiteiten'
                }
            }
        });

        ajaxActiviteitStore.load(function (records, operation, success) {
            //the operation object contains all of the details of the load operation
            console.log(success);
        });
    }
});

Это приводит к исключению «Uncaught TypeError: Невозможно прочитать свойство« длина »неопределенного» в строке 7212 файла sencha-touch-debug.js. Я использую Sencha Touch версии 1.1.0.

Трассировка стека:

Uncaught TypeError: Cannot read property 'length' of undefined
Ext.data.Store.Ext.extend.loadRecords  sencha-touch-debug.js:7212
Ext.data.Store.Ext.extend.onProxyLoad  sencha-touch-debug.js:7024
(anonymous function)  sencha-touch-debug.js:8742
Ext.data.Connection.Ext.extend.onComplete  sencha-touch-debug.js:17566
Ext.data.Connection.Ext.extend.onStateChange  sencha-touch-debug.js:17513
(anonymous function)  sencha-touch-debug.js:3421

Что я здесь не так делаю?

Я нашел обходной путь, добавив прослушиватель к прокси, который прослушивает событие «исключение», но я бы предпочел, чтобы вызывалась функция обратного вызова загрузки хранилища. Я делаю что-то не так или это поведение по умолчанию?

Спасибо

Sander

Ответы [ 2 ]

7 голосов
/ 30 августа 2011

Я сталкиваюсь с той же исключительной ситуацией (Uncaught TypeError: Невозможно прочитать свойство 'length' из неопределенного) с AjaxProxy (ST 1.1.0), если сервер возвращает ошибку (404, 500, ...).

На самом деле, я думаю, что проблема в методе Ext.data.AjaxProxy.createRequestCallback. Я решил свою проблему с грязным кодом, как это:

var ajaxActiviteitStore = new Ext.data.Store({
    model: "Activiteit",
    storeId: 'ajaxActiviteitStore',
    proxy: {
        type: 'ajax',
        url: 'some nonexistent url',
        reader: {
            type: 'json',
            root: 'activiteiten'
        },
        listeners: {
            exception: function(store, response, op) {
               console.log('Exception !');

               // hack to avoid js exception :
               // TypeError: 'undefined' is not an object (evaluating 'records.length')
               // on line sencha-touch-debug-1-1-0.js:7212
               op.records = [];
            }
        }
    }
});

Надеюсь, это поможет, и я постараюсь открыть вопрос на форуме sencha-touch.

2 голосов
/ 19 августа 2011

Я думаю, у вас есть еще одна проблема - несуществующий URL. Тем не менее, попробуйте это:

var storeException = 0; 

this.ajaxActiviteitStore = new Ext.data.Store({
    model: "Activiteit",
    storeId: 'ajaxActiviteitStore',
    proxy: {
        type: 'ajax',
        url: 'some nonexistent url',
        reader: {
            type: 'json',
            root: 'activiteiten'
        },
    listeners: {
            exception: {
            fn: function(proxy, response, operation ) {                         
                        // you can parse `response.responseText` to make some decisions
                    storeException = 404;                           
                }
        }
        }
    }
});

this.ajaxActiviteitStore.load({
    scope: this,
    callback: function (records, operation, success) {
        if (storeException==0) {
            // do something
        } else {
            alert('Service unaviable');
        }
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...