Что jQuery эквивалентен Ajax Прототипа. Responders.register?

Существует 2 основных вида транзакций; транзакции соединения и окружающие транзакции. Транзакция соединения (такая как SqlTransaction) связывается непосредственно с соединением дб (таким как SqlConnection), что означает, что необходимо продолжать раздавать соединение - хорошо в некоторых случаях, но не позволяет, "создают/используют/выпускают" использование, и не позволяет работу перекрестного дб. Пример (отформатированный для пространства):

using (IDbTransaction tran = conn.BeginTransaction()) {
    try {
        // your code
        tran.Commit();
    }  catch {
        tran.Rollback();
        throw;
    }
}

Не слишком грязный, но ограниченный нашим соединением "ведут". Если мы хотим обратиться к различным методам, мы теперь должны передать, "ведут" вокруг.

альтернатива является окружающей транзакцией; новый в.NET 2.0, объект TransactionScope (System.Transactions.dll) позволяет использование по диапазону операций (подходящие поставщики автоматически поступят на службу в окружающую транзакцию). Это облегчает модифицировать в существующий (нетранзакционный) код и говорить с несколькими поставщиками (хотя DTC примет участие, если Вы будете говорить с больше чем одним).

, Например:

using(TransactionScope tran = new TransactionScope()) {
    CallAMethodThatDoesSomeWork();
    CallAMethodThatDoesSomeMoreWork();
    tran.Complete();
}

Примечание здесь, что эти два метода могут обработать свои собственные соединения (открывается/использует/закрывает/располагает), все же они тихо станут частью окружающей транзакции без нас имеющий необходимость передать что-либо в. Если бы

, Если Ваши ошибки в коде, Расположите (), то будет назван без Полного (), таким образом, это будет откатываться. Ожидаемое вложение и т.д. поддерживается, хотя Вы не можете откатывать внутреннюю транзакцию, все же завершают внешнюю транзакцию: если кто-либо недоволен, транзакция прерывается.

другое преимущество TransactionScope состоит в том, что он не связывается только с базами данных; любой осведомленный о транзакции поставщик может использовать его. WCF, например. Или существуют даже некоторые TransactionScope-совместимые объектные модели вокруг (т.е. классы.NET с возможностью отката - возможно, легче, чем сувенир, хотя я никогда не использовал этот подход сам).

, В целом, очень, очень полезный объект.

Некоторые протесты:

  • На SQL Server 2000, TransactionScope сразу перейдет к DTC; это фиксируется в SQL Server 2005 и выше, это может использовать LTM (намного меньше служебный), пока Вы не говорите с 2 источниками и т.д., когда это поднято до DTC.
  • существует незначительный сбой , который означает, что Вы, возможно, должны были бы настроить свою строку подключения

7
задан Rob W 28 December 2011 в 22:30
поделиться

3 ответа

http://docs.jquery.com/Ajax/ajaxError#examples

$('#toperrorbox').ajaxError(function (event, request, settings) {
   $(this).after("<p style='color:red'>"+ request.responseText +"</p>");
}

Прикрепите функцию, которая будет выполняться всякий раз, когда запрос AJAX не работает.

3
ответ дан 7 December 2019 в 07:49
поделиться

Прототипы Ajax.Responders являются глобальными слушателями, которые прослушивают ВСЕ события ajax. У jQuery действительно есть эквивалент. Глобальные События Ajax .

Синтаксис немного отличается из-за природы jQuery, но что-то похожее на это должно помочь:

$('#toperrorbox').bind('ajaxError', function (event, XMLHttpRequest, ajaxOptions, thrownError) {
   // thrownError only passed if an error was caught
   // this == dom element listening
   var message = thrownError === undefined? XMLHttpRequest.responseText : thrownError.message;
   $(this).after("<p style='color:red'>"+ message +"</p>");
}

В этом случае XMLHttpRequest.responseText будет содержать возвращенное тело (если есть) с сервера при неудачном запросе. И thrownError будет содержать фактическое исключение, которое, как я полагаю, вам действительно нужно. Но я бы рекомендовал проверить, действительно ли было передано исключение, прежде чем пытаться распечатать его сообщение, что я сделал в моем примере. Если он поймал исключение, он будет использовать это сообщение, но если нет, он будет использовать ответ сервера.

Стоит отметить, что в jQuery все события всегда к чему-то привязаны. Обычно это узел DOM, но возможно окно или документ . Если вы хотите сделать то же самое, без привязки к конкретному элементу, над которым нужно действовать (как в приведенном выше примере), вы можете привязать событие к окну и выбрать элемент (ы) для работы в ваш обратный вызов выглядит следующим образом:

$(window).bind('ajaxError', function (event, XMLHttpRequest, ajaxOptions, thrownError) {
   // thrownError only passed if an error was caught
   // this == dom element listening
   var message = thrownError === undefined? XMLHttpRequest.responseText : thrownError.message;
   $('#toperrorbox').after("<p style='color:red'>"+ message +"</p>");
}

Это может предоставить вам больший контроль над событиями, поскольку вам не нужно помнить, к каким элементам они были привязаны, и если вы не использовали анонимные функции, вы могли отвязать ] конкретные обратные вызовы по желанию.

4
ответ дан 7 December 2019 в 07:49
поделиться

Я не знаю прототипа, но уверен, что это примерно так :

$.ajax({
    error: function(xhr, textStatus, exception) {
        if (exception.message != "Syntax error") {
             var newItem = '<p style="color:red">' + exception.message + '</p>';
             $('#toperrorbox').after(newItem);
        }
    }
});

Редактировать: или вы можете попробовать что-то более глобальное:

$('#toperrorbox').ajaxError(function(event, XMLHttpRequest, ajaxOptions, thrownError) {
        if (thrownError != "Syntax error") {
             var newItem = '<p style="color:red">' + thrownError + '</p>';
             $(this).after(newItem);
        }
    })
0
ответ дан 7 December 2019 в 07:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: