"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > JavaScript에서 Promise를 강제로 취소할 수 있나요?

JavaScript에서 Promise를 강제로 취소할 수 있나요?

2024년 11월 24일에 게시됨
검색:643

 Can We Forcefully Cancel Promises in JavaScript?

Promise: 정말 강제 취소가 가능한가요?

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