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
'programing' 카테고리의 다른 글
XML로 직사각형을 그릴 수 있습니까? (0) | 2023.10.19 |
---|---|
Linux에서 파일을 열 때 O_CLOEXEC을 언제 사용해야 합니까? (0) | 2023.10.19 |
CSS를 사용한 서식 번호(소수점, 수천 개의 구분자, 현지화 등) (0) | 2023.10.19 |
테이블에 두 개의 외국 열쇠가 있을 수 있습니까? (0) | 2023.10.14 |
여러 표를 기준으로 합산하는 방법 (0) | 2023.10.14 |