아니요. 아직 할 수 없습니다.
ES6 약속은 아직 취소를 지원하지 않습니다 . 진행 중이며 디자인은 많은 사람들이 정말 열심히 노력한 것입니다. 사운드 취소 의미론은 제대로 이해하기 어렵고 진행중인 작업입니다. "가져 오기"저장소, esdiscuss 및 GH에 대한 여러 다른 저장소에 대한 흥미로운 논쟁이 있지만 내가 당신이라면 인내심을 가질 것입니다.
근데 근데 .. 취소가 정말 중요 해요!
문제의 현실은 취소가 클라이언트 측 프로그래밍에서 정말 중요한 시나리오라는 것입니다. 웹 요청 중단과 같이 설명하는 경우는 중요하며 어디에나 있습니다.
그래서 ... 언어가 나를 망 쳤어!
네, 죄송합니다. 약속은 더 많은 것이 지정되기 전에 먼저 들어가야했습니다. 그래서 그들은 .finally
그리고 같은 유용한 것없이 들어갔습니다. .cancel
하지만 DOM을 통해 사양으로가는 중입니다. 취소는 나중에 생각할 필요 가 없으며 시간 제약 일 뿐이며 API 설계에 대한보다 반복적 인 접근 방식입니다.
그래서 내가 무엇을 할 수 있니?
몇 가지 대안이 있습니다.
- 사양보다 훨씬 빠르게 이동할 수있는 블루 버드 와 같은 타사 라이브러리를 사용하여 취소 및 기타 혜택을받을 수 있습니다. 이것이 WhatsApp과 같은 대기업이하는 일입니다.
- 취소 토큰을 전달 합니다.
타사 라이브러리를 사용하는 것은 매우 분명합니다. 토큰의 경우 다음과 같이 메서드에서 함수를 가져온 다음 호출하도록 할 수 있습니다.
function getWithCancel(url, token) {
var xhr = new XMLHttpRequest;
xhr.open("GET", url);
return new Promise(function(resolve, reject) {
xhr.onload = function() { resolve(xhr.responseText); });
token.cancel = function() {
xhr.abort();
reject(new Error("Cancelled"));
};
xhr.onerror = reject;
});
};
다음을 수행 할 수 있습니다.
var token = {};
var promise = getWithCancel("/someUrl", token);
token.cancel();
실제 사용 사례- last
토큰 접근 방식에서는 그리 어렵지 않습니다.
function last(fn) {
var lastToken = { cancel: function(){} };
return function() {
lastToken.cancel();
var args = Array.prototype.slice.call(arguments);
args.push(lastToken);
return fn.apply(this, args);
};
}
다음을 수행 할 수 있습니다.
var synced = last(getWithCancel);
synced("/url1?q=a");
synced("/url1?q=ab");
synced("/url1?q=abc");
synced("/url1?q=abcd").then(function() {
});
그리고 아니요, Bacon 및 Rx와 같은 라이브러리는 관찰 가능한 라이브러리이기 때문에 여기에서 "빛나지"않습니다. 스펙에 얽매이지 않음으로써 사용자 수준의 약속 라이브러리와 동일한 이점이 있습니다. Observable이 네이티브가 될 때 ES2016에서 볼 수 있기를 기다릴 것입니다. 그들은 이다 그러나 선행 입력을위한 멋진.