Понимание 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 для фильтрации любых вызовов оригинала отложенные уведомления или уведомления с помощью методов.