Понимание Deferred.pipe()
Я читал об отсрочке и promises в jQuery, но я еще не использовал его.
Я понял все очень хорошо, но метод pipe. Я действительно не понял, что это такое.
Может ли кто-нибудь помочь мне понять, что он делает и где его можно использовать?
Я знаю, что есть такой вопрос, который называется именно здесь (здесь), но это не то же самое. Я прошу о помощи, чтобы понять это и привести пример. Цель другого вопроса - выяснить, почему он не работает в конкретном случае.
Ответы
Ответ 1
В принципе, Deferred.pipe() является асинхронным эквивалентом $. map(). Он реализует новые значения из других значений, представленных в качестве входных данных, но его цель должна использоваться с продолжениями.
Давайте начнем с примера, который требует только $.each()
и выдает запрос AJAX, который возвращает простой объект. Для каждого свойства этого объекта нам нужен элемент управления формой, атрибут id
- это ключ свойства, чтобы установить его значение в значение свойства. Мы можем написать что-то вроде:
$.ajax("your/url", {
dataType: "json"
}).done(function(data) {
$.each(data, function(key, value) {
$("#" + key).val(value);
});
});
Теперь скажем, мы хотим применить некоторую функцию к значениям перед обновлением элементов управления формой. Если мы делаем это локально, нам нужно написать:
$.ajax("your/url", {
dataType: "json"
}).done(function(data) {
$.each(data, function(key, value) {
// doSomethingWith() projects values synchronously, as map() does.
$("#" + key).val(doSomethingWith(value));
});
});
Но что произойдет, если doSomethingWith()
не реализована на стороне клиента, а на стороне сервера через другой веб-сервис? В этом случае мы хотим связать поток управления со вторым запросом AJAX и обновлять только элементы управления формы при возврате второго запроса. Deferred.pipe()
делает это легко:
$.ajax("your/url", {
dataType: "json"
}).pipe(function(theOriginalData) {
return $.ajax("your/web/service/doSomethingWith", {
data: theOriginalData,
dataType: "json"
});
}).done(function(theFinalData) {
$.each(theFinalData, function(key, value) {
$("#" + key).val(value);
});
});
Ответ 2
Хорошо, я вижу много справочных материалов в другом ответе здесь, но чтение иногда не совпадает с пониманием.
Мне легче всего думать о обещании и применении к нему метода .done() против .pipe(). Каждый действует по-разному. Если я беру prom.done(function (result) {...}), то после этого я могу использовать более .done() или .fail(), потому что каждый вызов .done() или .fail() возвращает точный такое же обещание. Поэтому каждая функция будет привязана к первоначальному обещанию и будет ли она решена или отклонена.
Теперь сравните это с .pipe(). Если я возьму prom.pipe(function (result) {...}), то то, что выходит из .pipe(), является новым обещанием! Если я затем присоединяю к этому обещанию .done() или .fail(), то эти функции получат измененную версию результатов, возвращаемых .pipe(), а не исходные результаты.
Так что .pipe(), по моему опыту, редко необходим. Единственный момент, когда это действительно пригодится, - это если вам нужно изменить данные, которые возвращаются из обещания, прежде чем другой код увидит его (например, изменив некоторые результаты вызова AJAX на стороне клиента, прежде чем какой-либо другой код на стороне клиента будет работать с это), или если вам нужно упорядочить вещи. Например, после того, как обещание A разрешило или отклонило, предпримите другое действие, и тогда только тогда, когда это будет сделано, мы хотим, чтобы другой код был запущен. Весь другой код прикреплен к обещанию B, которое поступает из вызова .pipe().
Вот недавний вопрос, когда у другого пользователя возникли проблемы с использованием promises и .pipe()/. done()/. Когда() и я попытался предоставить некоторый код, чтобы прояснить использование каждого из них в jsFiddle: Сделайте что-нибудь, когда все отложенные решения будут решены
Ответ 3
Hiya - это то, что вы ищете:)
[nice read] http://www.bennadel.com/blog/2255-Using-jQuery-s-Pipe-Method-To-Change-Deferred-Resolution.htm
цитата
Метод pipe() обеспечивает фильтр как для успеха, так и для отказа разрешений (запроса AJAX). Если исходное разрешение успех, фильтр pipe() либо передает действительно успешный ответ через; или, он изменяет разрешение, возвращая новое отклоненное Обещаю. Затем, если исходный запрос был неудачным, что было бы действительно неожиданный в нашем API, фильтр pipe() просто проходит через нормализованная структура ответа API....
Ссылка на стек с примером Понимание jQuery Deferred.pipe() (есть jsfiddle в нем)
Понимание отложенных и обещаний? см. здесь http://joseoncode.com/2011/09/26/a-walkthrough-jquery-deferred-and-promise/
Официальная страница API JQuery http://api.jquery.com/deferred.pipe/ (с примерами)
Описание: Утилита для фильтрации и/или цепочки Отложенные.
Метод deferred.pipe() возвращает новое обещание, которое фильтрует статус и значения отложенных через функцию. СделанныйФильтр и Функции failFilter фильтруют исходные отложенные разрешенные/ отклоненный статус и значения. Начиная с jQuery 1.7, метод также принимает функция progressFilter для фильтрации любых вызовов оригинала отложенные уведомления или уведомления с помощью методов.