programing

jQuery derped의 "그때" 방법을 언제 사용해야 하고 "파이프" 방법을 언제 사용해야 합니까?

lastcode 2023. 10. 19. 22:20
반응형

jQuery derped의 "그때" 방법을 언제 사용해야 하고 "파이프" 방법을 언제 사용해야 합니까?

jQuery's에는 비동기식 함수 체이닝을 구현하는 데 사용할 수 있는 두 가지 함수가 있습니다.

then()

deferred.then( doneCallbacks, failCallbacks ) Returns: Deferred

doneCallbacks Depended가 해결되면 호출되는 함수 또는 함수 배열.
failCallback Depended가 거부될 때 호출되는 함수 또는 함수 배열.

pipe()

deferred.pipe( [doneFilter] [, failFilter] ) Returns: Promise

doneFilter Depended가 해결될 때 호출되는 선택적 기능입니다.
failFilter Depended가 거부될 때 호출되는 선택적 기능.

알고있어요then()보다 조금 더 오래 전부터pipe()그래서 후자는 추가적인 이익을 더해야 하지만, 정확히 다른 점은 저를 제외하고 있습니다.이름이 다르고 a를 반환하는 것의 차이가 있지만 둘 다 거의 동일한 콜백 파라미터를 사용합니다.Deferred그리고 A를 돌려주는 것.Promise대수롭지 않은 것 같습니다

공식 문서를 몇 번이고 반복해서 읽었지만 항상 너무 '밀도'가 높아 제 머리를 감싸기가 어렵습니다. 검색을 통해 이 기능에 대해 많은 논의가 이루어졌지만 각각의 다른 장단점을 명확하게 해주는 것은 찾을 수 없었습니다.

그래서 언제 사용하는게 더 나을까요?then그리고 언제 사용하는 것이 더 나을까요?pipe?


추가

펠릭스의 훌륭한 대답은 이 두 기능이 어떻게 다른지를 밝히는데 정말 도움이 되었습니다.하지만 저는 기능적인 경우가 있는지 궁금합니다.then()그것보다 더 좋습니다.pipe().

는 것이 분명합니다.pipe()보다 더 강력합니다.then()전자는 후자가 할 수 있는 모든 것을 할 수 있는 것 같습니다.한가지 사용이유then()이름이 동일한 데이터를 처리하는 일련의 함수를 종료하는 역할을 반영하는 것일 수 있습니다.

하지만 다음을 요구하는 사용 사례가 있나요?then()원본을 돌려주는 중입니다Deferred할 수 없는 일입니다pipe()그것이 새로운 것을 돌려주기 때문에.Promise?

JQuery 1.8 이후 .then와 똑같이 굴다.pipe:

감가 상각 통지:jQuery 1.8 기준,deferred.pipe()메소드는 더 이상 사용되지 않습니다.deferred.then()대신에 method를 사용해야 합니다.

그리고.

jQuery 1.8 기준,deferred.then()method는 함수를 통해 지연된 상태와 값을 필터링할 수 있는 새로운 약속을 반환하며, 현재 deprec된 것을 대체합니다.deferred.pipe()방법.

아래의 예들은 여전히 일부에게 도움이 될 것입니다.


이들은 다양한 용도로 사용됩니다.

  • .then()프로세스의 결과를 작업하고 싶을 때, 즉 문서에 나와 있는 대로 지연된 개체가 해결되거나 거부될 때 언제든지 사용할 수 있습니다.사용하는 것과 같습니다..done()아니면.fail().

  • 당신이 사용합니다..pipe()어떻게든 결과를 (사전에) 필터링할 수 있습니다.콜백의 반환 값:.pipe()에 대한 논쟁으로 전달될 것입니다.done그리고.fail콜백 지연된 개체를 할 수 있으며 다음콜백은 이 지연된 개체에 등록됩니다.또한 다른 지연된 개체를 반환할 수 있으며 다음 콜백은 이 지연된 개체에 등록됩니다.

    그건 사실이 아닙니다..then()(또는.done(),.fail()), 등록된 콜백의 반환 값은 무시됩니다.

그래서 당신이 사용하는 것도 아닙니다. .then() 아니면 .pipe(). 당신은 사용할 수 있습니다..pipe()와 같은 목적으로.then()하지만 그 역은 성립하지 않습니다.


예제1

일부 작업의 결과는 개체 배열입니다.

[{value: 2}, {value: 4}, {value: 6}]

최소값과 최대값을 계산하려고 합니다.두 개를 사용한다고 가정해 보겠습니다.done콜백:

deferred.then(function(result) {
    // result = [{value: 2}, {value: 4}, {value: 6}]

    var values = [];
    for(var i = 0, len = result.length; i < len; i++) {
        values.push(result[i].value);
    }
    var min = Math.min.apply(Math, values);

   /* do something with "min" */

}).then(function(result) {
    // result = [{value: 2}, {value: 4}, {value: 6}]

    var values = [];
    for(var i = 0, len = result.length; i < len; i++) {
        values.push(result[i].value);
    }
    var max = Math.max.apply(Math, values);

   /* do something with "max" */ 

});

두 경우 모두 목록 위에서 반복하고 각 개체에서 값을 추출해야 합니다.

두 콜백에서 개별적으로 이 작업을 수행할 필요가 없도록 미리 값을 추출하는 것이 좋지 않을까요?네! 그리고 그것이 우리가 사용할 수 있는 것입니다..pipe()상:

deferred.pipe(function(result) {
    // result = [{value: 2}, {value: 4}, {value: 6}]

    var values = [];
    for(var i = 0, len = result.length; i < len; i++) {
        values.push(result[i].value);
    }
    return values; // [2, 4, 6]

}).then(function(result) {
    // result = [2, 4, 6]

    var min = Math.min.apply(Math, result);

    /* do something with "min" */

}).then(function(result) {
    // result = [2, 4, 6]

    var max = Math.max.apply(Math, result);

    /* do something with "max" */

});

분명히 이것은 꾸며낸 예시이고 이 문제를 해결하기 위한 많은 다양한 (아마도 더 나은) 방법들이 있지만, 요점을 잘 보여주기를 바랍니다.


예제2

Ajax 호출을 고려해 보십시오.이전 Ajax 호출이 완료된 후에 하나의 Ajax 호출을 시작하려는 경우가 있습니다.한 가지 방법은 A 안에서 두 번째 통화를 하는 것입니다.done콜백:

$.ajax(...).done(function() {
    // executed after first Ajax
    $.ajax(...).done(function() {
        // executed after second call
    });
});

이제 코드를 분리하고 이 두 개의 Ajax 호출을 함수 안에 넣겠다고 가정해 보겠습니다.

function makeCalls() {
    // here we return the return value of `$.ajax().done()`, which
    // is the same deferred object as returned by `$.ajax()` alone

    return $.ajax(...).done(function() {
        // executed after first call
        $.ajax(...).done(function() {
            // executed after second call
        });
    });
}

지연된 개체를 사용하여 호출하는 다른 코드를 허용하려고 합니다.makeCalls두번째 아약스 콜에 콜백을 첨부합니다.

makeCalls().done(function() {
    // this is executed after the first Ajax call
});

A 내부에서 두번째 호출이 이루어짐에 따라 원하는 효과를 발휘하지 못할 것입니다.done외부에서 접근할 수 없는 콜백입니다.

해결책은 사용하는 것일 것입니다..pipe()대신:

function makeCalls() {
    // here we return the return value of `$.ajax().pipe()`, which is
    // a new deferred/promise object and connected to the one returned
    // by the callback passed to `pipe`

    return $.ajax(...).pipe(function() {
        // executed after first call
        return $.ajax(...).done(function() {
            // executed after second call
        });
    });
}

makeCalls().done(function() {
    // this is executed after the second Ajax call
});

사용함으로써.pipe()이제 통화의 실제 흐름/순서를 노출하지 않고도 "내부" Ajax 통화에 콜백을 추가할 수 있습니다.


일반적으로 지연된 객체는 코드를 분리하는 흥미로운 방법을 제공합니다 :)

반드시 사용해야 하는 경우는 없습니다.then()위에pipe(). 항상 다음 값을 무시하도록 선택할 수 있습니다.pipe()지나가겠습니다.사용할 때 약간의 성능 히트가 있을 수 있습니다.pipe-- 하지만 중요하지 않을 것 같습니다.

그래서 당신이 항상 사용할 수 있는 것처럼 보일 수도 있습니다.pipe()두 가지 경우에하지만 사용함으로써pipe(), 귀하는 귀하의 코드를 읽는 다른 사람들(지금으로부터 6개월 후의 본인 포함)에게 반환 가치에 어느 정도 중요성이 있다고 연락하고 있습니다.버리면 이 의미론적 구조를 위반하는 겁니다.

사용하지 않는 값을 돌려주는 기능이 있는 것과 같습니다. 혼란스럽습니다.

을 합니다.then()당신이 해야 할 때, 그리고pipe()당신이..

사실은 그들 사이의 차이가.then()그리고..pipe()불필요한 것으로 간주되어 jQuery 버전 1.8과 동일하게 만들어졌습니다.

jQuery의 버그 트래커 티켓 #11010 "MAKE DEPERED"에 댓글이 달렸습니다.그런 다음 == 연기됨.파이프 라이크 프로미스/A":

1.8에서는 그때 낡은 것을 제거하고 현재의 파이프로 교체할 것입니다.하지만 매우 슬픈 결과는 우리가 사람들에게 비표준적인 완료, 실패 및 진행을 사용하라고 말해야 한다는 것입니다. 왜냐하면 이 제안은 단순하고 효율적이며 콜백을 추가하는 것을 의미하지 않기 때문입니다.

(emph 섀시 지뢰)

언급URL : https://stackoverflow.com/questions/9583783/when-should-i-use-jquery-deferreds-then-method-and-when-should-i-use-the-pip

반응형