Каков наиболее удобный способ остановить Ajax-объект в прототипе от проглатывания исключений? - PullRequest
1 голос
/ 10 мая 2009

Рассмотрим этот код:

new Ajax.Request('?service=example', {
    parameters : {tags : 'exceptions'},
    onSuccess : this.dataReceived.bind(this)
});

Если в функции dataReceived возникает исключение, когда оно вызывается Ajax-объектом, оно проглатывается некоторым кодом обработки исключений, и весь процесс затем молча завершается. В браузер никогда не добавляются никакие исключения, и отладка немного утомительна (по понятным причинам). Есть ли прямой способ предотвратить это?

1 Ответ

3 голосов
/ 10 мая 2009

Я думаю, что вы можете включить обработчик обратного вызова onException с параметрами запроса:

new Ajax.Request('?service=example', {
  parameters : {tags : 'exceptions'},
  onSuccess : this.dataReceived.bind(this),
  onException : function(request, ex) { // react somehow }
});

Чтобы сделать это на глобальном уровне, обработчик обратного вызова может быть зарегистрирован с помощью объекта Ajax.Responders :

Ajax.Responders.register({
  onException: function(request, ex) {
    // react somehow
  }
});

Первым аргументом будет объект Ajax.Request, который вызвал обратный вызов.

P.S. / FYI: ваше исключение скрывается этим кодом в источнике прототипа :

dispatchException: function(exception) {
  (this.options.onException || Prototype.emptyFunction)(this, exception);
  Ajax.Responders.dispatch('onException', this, exception);
}

Вот как правильно реализовать обратный вызов onException.

Ajax.Responders.register({ 
        onException: function(request, exception) { 
                (function() { throw exception; }).defer(); 
        } 
});

Как указано здесь: https://stackoverflow.com/a/2606239/147349

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...