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가 본질적으로 취소를 지원하지 않는다는 점은 실망스럽지만 앞서 언급한 기술은 실행 가능한 해결 방법을 제공합니다. 언어가 발전함에 따라 진정한 약속 취소가 미래에는 현실이 될 수도 있습니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3