Zepto $.post не имеет обработчика ошибок

Я использую Zepto в своем приложении в качестве альтернативы jQuery, и я работал над задачей, когда понял, что $.ajax имеет обработчик ошибок, но другие методы, такие как $.post, $.get, не имеют его.

Что может быть причиной этого?

Подпись функции

$.post(url, [данные], функция(данные, статус, xhr){...}, [тип данных])

$.get(url, [данные], [функция(данные, статус, xhr){ ... }], [тип данных])

использованная литература

  1. $.ajax
  2. $.post
  3. $.get

person Rajesh    schedule 31.12.2015    source источник


Ответы (4)


Согласно вашему вопросу о $.get и $.post. Да, исходный код на github ответил, что нет обработчики ошибок для этих методов, но вы можете добавить общий обработчик ошибок в $.ajaxSettings

Но вместо $.ajax с обратными вызовами лучше использовать Zepto отложенный API. Вы должны включить его вручную.

Он предоставляет $.Deferred обещаний API. Зависит от модуля «обратные вызовы». При включении $.ajax() поддерживает интерфейс обещаний для объединения обратных вызовов.

С deferred вы можете поймать ошибку в цепочках deferred/promise:

$.post(/*any options*/).done(/*success handler*/).fail(/*error handler*/)

or

$.post().then(function() {
   // success code here
}, function() {
   // error code here
});
person Pinal    schedule 31.12.2015
comment
Это хороший ответ, но, как я уже сказал в вопросе $.ajax, есть обработчик ошибок, и я обновил свой код, чтобы использовать его. Вопрос в том, почему в остальных методах отсутствует обработчик ошибок. - person Rajesh; 31.12.2015

Это не ошибка, просто так устроен jQuery API, который эмулирует Zepto (см., например, https://api.jquery.com/jquery.get/).

Если вам нужны обратные вызовы, используйте $.ajax, глобальные обратные вызовы или промисы.

person thomasfuchs    schedule 31.12.2015
comment
Упущен один момент - jQuery возвращает jqXHR (у него есть метод ошибки), собственный xhr от Zepto. Таким образом, обработчик ошибок действительно отсутствует в дизайне Zepto. - person Pinal; 31.12.2015

На мой взгляд, обработчик ошибок недоступен, потому что это добавило бы путаницы.
Текущая спецификация функции:

$.get(url, [data], [function(data, status, xhr){ ... }], [dataType])

при добавлении обработчика ошибок параметр будет преобразован в:

$.get(url, [data], [function(data, status, xhr){ ... }], [function(data, status, xhr){ ... }], [dataType])

В случае дополнительного параметра обработчика ошибок было бы сложно понять, какой обработчик вы имеете в виду при выполнении ajax-вызова:

$.get('http://example.com', {query: 1}, function(result) {
    //Handle the request
});

В этом случае обработчик ошибки или успеха? Это довольно сложно понять. Конечно, вы можете добавить некоторые дополнительные null в параметры, но это не чистое решение и добавляет путаницы.

В $.ajax есть обработчик ошибок, потому что он принимает параметры как объект JavaScript. Это не создает никаких проблем, если вы укажете функцию обработчика ошибок в качестве свойства объекта параметров.

Решение.
Просто используйте обещания:

var xhr = $.post(...);
xhr.done(function(data, status, xhr){ 
  //Handle when success
}).fail(function(xhr, errorType, error){
  //Handle when an error occurred.
}).always(function(){ 
  //A handler executed always, on success or error
  //Use this to hide the loading image for example
})

При вызове функция вызова ajax вернет объект обещания. Прикрепите к промису свои обработчики успеха (метод done()) и обработчики ошибок (метод using fail()).
always() выполняется в любом случае (после выполнения обработчиков done() или fail()). Полезно завершить любую работу, связанную с запросом, например, скрыть загрузочную картинку.

person Dmitri Pavlutin    schedule 31.12.2015

Расширение ответа @Pinal, я считаю, что функция parseArguments создает проблему:

Исходный код

ПОЛУЧИТЬ

$.get = function(/* url, data, success, dataType */){
  return $.ajax(parseArguments.apply(null, arguments))
}

Разбирать аргументы

function parseArguments(url, data, success, dataType) {
  if ($.isFunction(data)) dataType = success, success = data, data = undefined
  if (!$.isFunction(success)) dataType = success, success = undefined
  return {
    url: url,
    data: data,
    success: success,
    dataType: dataType
  }
}

Возможное решение

function parseArguments(url, data, success, error, dataType) {
  if ($.isFunction(data)) dataType = success, success = data, data = undefined
  if (!$.isFunction(success)) dataType = success, success = undefined
  if (!$.isFunction(error)) dataType = error, error = undefined
  return {
    url: url,
    data: data,
    success: success,
    error:error,
    dataType: dataType
  }
}

Но да, это может быть общая функция, и ее изменение может иметь большое значение.

person Rajesh    schedule 31.12.2015