2012-06-01 2 views
12

У меня есть обещание $.ajax и вы хотите проверить, содержит ли мой (синтаксически корректный) ответ ошибку, вызывая отклоненный статус в этом случае.Выбрасывание ошибки в отложенном объекте jQuery

Я работал с моей собственной библиотекой обещаний, которая легко справляется с такими задачами. Мне не очень нравится реализация jQuery's Promise (cache) с его Deferred object и, возможно, что-то упустил из виду, потому что я редко использую его. Я думаю, что путь только с помощью .then(), который кажется довольно сложным:

return $.ajax(...).then(function success(response) { 
    var problem = hasError(response); 
    if (problem) { 
     var error = new $.Deferred; 
     error.reject(problem); 
     return error; 
    } else 
     return response; 
}); 

Это должно вернуть обещание, которое отвергается в случае сетевых ошибок или проблем с ответом. Но возвращается ли отвергнутый отложенный вариант [только | лучший | самый короткий] путь?

Я также хотел бы узнать, как справиться с такими «обработчиками ответов об ошибках» в вариантах ajax, я не смог найти хорошую документацию о них.


Отказ от ответственности: Нет, я не могу изменить ответы сервера. Метод обнаружения проблемы является синхронным. Я не хочу использовать другие библиотеки, меня особенно интересует способ, которым jQuery решает это.

+0

ОК, с '.then()' Я имел в виду вещь, что '.pipe()' делает в jQuery :-( – Bergi

+0

от JQuery 1.8 pipe === then – Plynx

+0

Да, к счастью, они получили хотя бы то, что исправлено. – Bergi

ответ

31

Теперь обновлены для JQuery 1.8+

Самый простой способ решения это запустить реакцию $.ajax через .then для фильтрации на основе успеха или неудачи данных.

$.ajax() 
    .then(function (response) { 
     return $.Deferred(function (deferred) { 
      var problem = hasError(response); 

      if (problem) { 
       return deferred.reject(problem) 
      } 

      deferred.resolve(response); 
     }).promise(); 
    }); 

Вы могли бы вернуть это новое обещание любой вызывающий код будет потреблять этот:

var request = function() { 
    return $.ajax() 
     .then(function (response) { 
      return $.Deferred(function (deferred) { 
       var problem = hasError(response); 

       if (problem) { 
        return deferred.reject(problem) 
       } 

       deferred.resolve(response); 
      }).promise(); 
     }); 
}; 

request() 
    .done(function (response) { 
     // handle success 
    }) 
    .fail(function (problem) { 
     // handle failure 
    }); 
+0

Какая разница между трубой и потом? – Bergi

+1

'pipe' позволяет вам фильтровать значения отложенных до их отправки любым зарегистрированным обработчикам. 'then' действительно используется только для регистрации обработчиков, когда обещание разрешает или отклоняет. – Eli

+1

Нет, [по спецификации] (http://webcache.googleusercontent.com/search?q=cache%3awiki.commonjs.org/wiki/Promises/A) .then() будет делать именно это. Или jQuery бросил это и заменил имена методов? – Bergi