ES6에 도입된 Promise는 비동기 프로그래밍에 대한 접근 방식을 변화시켰습니다. 하지만 자동 검색 시나리오와 같이 우리가 개입하여 약속을 강제로 취소해야 하는 상황이 있습니다.
In 최신 JavaScript의 가혹한 현실은 아니요입니다. 약속은 현재 취소를 지원하지 않습니다.
직접 약속 취소는 옵션이 아니기 때문에 대체 접근 방식이 등장했습니다.
취소 토큰은 취소 가능한 변수를 함수에 전달할 수 있는 메커니즘입니다. 토큰이 호출되면 작업을 중단하고 관련 약속을 거부합니다. 예는 다음과 같습니다.
function getWithCancel(url) { // token for cancellation 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); // later on: token.cancel();
라이브러리 Bluebird와 같이 다른 고급 기능과 함께 약속 취소를 지원합니다.
이 패턴은 함수의 마지막 호출만 실행되도록 보장합니다. 이전 호출을 취소하기 위해 토큰 접근 방식을 사용합니다:
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"); // canceled synced("/url1?q=ab"); // canceled synced("/url1?q=abc"); // canceled synced("/url1?q=abcd").then(function() { // only this will run });
Promise가 본질적으로 취소를 지원하지 않는다는 점은 실망스럽지만 앞서 언급한 내용은 다음과 같습니다. 기술은 실행 가능한 해결 방법을 제공합니다. 언어가 발전함에 따라 미래에는 진정한 약속 취소가 현실이 될 수도 있습니다.
위 내용은 JavaScript에서 Promise를 강제로 취소할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!