Самый простой способ постобработки результата запроса jQuery ajax? - PullRequest
2 голосов
/ 13 сентября 2011

Предположим, у меня есть функция fancyParse, предназначенная для получения ответа, возвращенного сервером, и преобразования его во что-то другое.Эта функция выдает, если ответ не имеет никакого смысла, или если для него установлен специальный флаг «внутренняя ошибка».

Я бы хотел объединить эту функцию в вызов $.post, чтобы получить новый Deferred.Эта новая отсрочка потерпит неудачу, если запрос не удастся или fancyParse сгенерирует.Он будет успешным, если запрос завершится успешно и fancyParse успешно, и, что важно, передаст результат fancyParse его обратным вызовам об успешном завершении.

Идеальное решение будет выглядеть примерно так:

$.post('/url', etc).postprocess(fancyParse)
    .done(my_done_handler)
    .fail(my_fail_handler);

Что-то вроде этого уже доступно, или мне нужно написать такое postprocess самостоятельно?

Ответы [ 2 ]

4 голосов
/ 14 сентября 2011

Вы можете создать свой собственный отложенный объект:

$.postProcess = function(addr,test) {
  var dfd = $.Deferred();         // create deferred object
  $.post(addr)                    // make ajax call
  .success( function(response) {  // if ajax is OK
    if (test) {                   // Your filter test
      dfd.resolve("OK");          // if test is passed, call done()
    } else {
      dfd.reject("Bad test");     // otherwise call reject
    }
  })
  .error(function() {             // on ajax error
   dfd.reject("Error");           // reject
  });
  return dfd.promise();                     // return deferred object
};

//$.postProcess('/echo/json/',true)   // to test good case
//$.postProcess('/echo/json/',false)  // to test bad test
$.postProcess('/echo/error/',true)    // to test bad ajax
.done( function(msg){
    alert('ok:'+msg);
})
.fail( function(msg){
    alert('fail:'+msg);
});

http://jsfiddle.net/bouillard/FRsjV/

3 голосов
/ 13 сентября 2011

dataFilter функция может быть использована для обработки данных. Вы передаете его с вашей просьбой.

http://api.jquery.com/jQuery.ajax/

$.ajax({
    ...,
    dataFilter: function (data, type) {
        // do something with data and return it
        return data.toLowerCase();
    }
})
...