>웹 프론트엔드 >JS 튜토리얼 >JavaScript에서 Promise를 강제로 취소할 수 있나요?

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

Barbara Streisand
Barbara Streisand원래의
2024-10-30 15:09:03415검색

 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가 본질적으로 취소를 지원하지 않는다는 점은 실망스럽지만 앞서 언급한 내용은 다음과 같습니다. 기술은 실행 가능한 해결 방법을 제공합니다. 언어가 발전함에 따라 미래에는 진정한 약속 취소가 현실이 될 수도 있습니다.

위 내용은 JavaScript에서 Promise를 강제로 취소할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.