Отлов серверных ошибок {success:false}
Как отлавливать ответы сервера с ошибками {success:false} ? Например чтобы их выводить в консоли.
Как отлавливать глобально события exception у Прокси: http://docs.sencha.com/extjs/6.0/6.0...vent-exception ? Через эту штуку http://docs.sencha.com/extjs/6.0/6.0...p.domain.Store вроде не получается. Так как нет событий, связанных с ошибками в прокси... |
Для стора я переписывал onBatchException - помогло.
|
Цитата:
Может лучше домен свой сделать? Вот такой например: Ext.define('Ext.app.domain.ProxyServer', { extend: 'Ext.app.EventDomain', singleton: true, requires: [ 'Ext.data.proxy.Server' ], type: 'proxyServer', constructor: function() { var me = this; me.callParent(); me.monitor(Ext.data.proxy.Server); } }); |
Нет, не глобально. Просто когда создавал свои сторы, при необходимости добавлял этот обработчик, а что он делал это уже зависело от конкретного случая.
Насчет домена я согласен, идея тоже интересная. Но я ими никогда не пользовался, тут еще надо осмыслить. А как вы его думаете использовать? Подписаться на exception в глобальном контроллере приложения? |
Цитата:
И да, потом подписываться в listen. |
Странно, что нигде ситуация success:false не обрабатывается.
|
В общем, попробую домен сделать. Потом расскажу что из этого вышло.
|
http://docs.sencha.com/extjs/6.0/6.0...ore-event-load
Там есть successful. В крайнем случае там есть объект операции, у которого есть http://docs.sencha.com/extjs/6.0/6.0...d-cfg-response Но не рекомендую, он приватный. |
Цитата:
|
Для таких вещей, как централизованная обработка событий и т.п. есть более адекватный вид транспорта, называется Ext Direct. Голые Ajax запросы всегда были хаковым хаком, им и останутся. Что в переводе на русский означает: всё вручную.
|
А для Ext Direct есть какие-то готовые серверные библиотеки для Node.js и PHP? Чтобы не писать с нуля реализацию протокола.
REST настолько прост, что особо и писать там нечего. С RPC не все так просто оказалось. |
Цитата:
Цитата:
|
Я правильно понимаю, что в RPC в качестве маршрута используется имя функции? В данном случае "Server.Demo.Todo.create" (взято из примера https://github.com/jurisv/extdirect....el/TodoItem.js)
То есть по сути, я могу взять любую реализацию RPC? |
Он на вебсокетах сделан? Или такой же медленный как REST?
|
Цитата:
Цитата:
В любом случае web sockets уже потеряли смысл, ибо грядет царствие HTTP/2.0 и чем скорее оно приидет, тем лучше будет всем. |
И как тогда глобально отлавливать ошибки, если я перейду с одного вида прокси на другое? Проблема остается нерешенной же.
|
Вам же надо было отлавливать все ошибки централизованно? Ext.direct.Manager на каждую ошибку стреляет событие exception, на себе и по шине Direct. Ловите контроллером и обрабатывайте, как нужно.
|
Начал с этой темой разбираться. Смотрю пример. Не смог найти определение переменной Server.API (строка 40)
https://github.com/jurisv/extdirect....Application.js где она определена??? |
хехе я правильно понял, что переменная Server.API определяется вот таким хитрым способом?
{ "path": "/directapi", "remote": true } взято из файла https://github.com/jurisv/extdirect....extjs/app.json со строки 111 |
Цитата:
Есть и более интересные варианты с динамической загрузкой деклараций и созданием Providers по необходимости. В KitchenSink есть раздел с примерами на эту тему. Можно даже включать этот код в сборку приложения, клиенту в сущности важно лишь чтобы к моменту создания Provider объект с декларацией уже существовал. |
Есть что-нибудь посвежее чем этот модуль?
https://github.com/jurisv/nodejs.extdirect Он похоже не поддерживается. ЕС6 игнорирует. С путями проблемы, требует чтобы скрипт, генерирующий процесс и папка с API лежали на одном уровне. |
Можете поздравить. Прикрутил модуль https://github.com/jurisv/nodejs.extdirect к своему приложению.
Правда с путями к API проблема. Там нельзя указать абсолютный путь. Что с этим делать пока не знаю... Если разрабы ничего не будут делать, то придется этот модуль переписывать самому. В таком виде он не совсем удобоварим. |
Поздравляю. ;) Насколько я знаю, этот модуль вполне поддерживается, так что открывайте тикеты и задавайте вопросы. Автор модуля, Юрис, по-русски говорит отлично. ;)
|
Ура! Сделал домен и теперь можно глобально отлавливать ошибки из прокси!
|
Вот пример кода:
/** * Глобальный отлов серверных ошибок (для таблиц grid). */ Ext.define('Pir.core.app.domain.PirReaderJson', { extend: 'Ext.app.EventDomain', singleton: true, requires: [ 'Pir.core.data.reader.Json' ], type: 'pirReaderJson', prefix: 'pirReaderJson.', idMatchRe: /^\#/, constructor: function() { var me = this; me.callParent(); me.monitor(Pir.core.data.reader.Json); }, match: function(target, selector) { var result = false; //var alias = target.alias; if (selector === '*') { result = true; } // else if (this.idMatchRe.test(selector)) { // result = target.getStoreId() === selector.substring(1); // } else if (alias) { // result = Ext.Array.indexOf(alias, this.prefix + selector) > -1; // } return result; } }); /** * Этот класс создан для работы домена Pir.core.app.domain.PirReaderJson. */ Ext.define("Pir.core.data.reader.Json", { extend: "Ext.data.reader.Json", alias: "reader.pir-json", getResponseData: function() { var result = this.callParent(arguments); if (result.ErrorCode != "1") { this.fireEvent("pirerror", result.ErrorDescription, result); } return result; } }); /** * The main application class. An instance of this class is created by app.js when it * calls Ext.application(). This is the ideal place to handle application launch and * initialization details. */ Ext.define('PirDesktopFirst.Application', { extend: 'Ext.app.Application', name: 'PirDesktopFirst', controllers: ["Pir.core.controller.Root"], stores: [ // TODO: add global / shared stores here ], launch: function () { Pir.Core.selectServer("first"); }, onAppUpdate: function () { Ext.Msg.confirm('Application Update', 'This application has an update, reload?', function (choice) { if (choice === 'yes') { window.location.reload(); } } ); } }); Ext.define("Pir.core.controller.Root", { extend: "Ext.app.Controller", requires: ["Pir.core.app.domain.PirReaderJson"], init: function() { this.listen({ pirReaderJson: { "*": { pirerror: this.onPirReaderJsonEvent } } }); }, onPirReaderJsonEvent: function(errorDescription, result) { Ext.toast({ html: errorDescription, title: 'Ошибка на сервере', width: 400 }); } }); |
Интересный пример, но я бы ловил ошибки на транспорте; когда данные уже доползли до reader, обычно бывает уже поздно пытаться что-то делать с запросом.
В Ext Direct есть механизм исключений, можно бросать их на сервере при обработке запросов и ловить на клиенте. |
А что значит ловить ошибки на транспорте?
|
Если речь идет (ловить на транспорте) до того, как данные превратятся в JSON, то данные будут ДВА РАЗА превращаться в JSON. Что не есть хорошо.
|
Часовой пояс GMT +3, время: 13:25. |