首頁  >  文章  >  web前端  >  我們可以強制取消 JavaScript 中的 Promise 嗎?

我們可以強制取消 JavaScript 中的 Promise 嗎?

Barbara Streisand
Barbara Streisand原創
2024-10-30 15:09:03357瀏覽

 Can We Forcefully Cancel Promises in JavaScript?

Promise:我們真的可以強制取消嗎?

ES6 中引入的 Promise 改變了我們的非同步程式設計方法。然而,在某些情況下,我們可能需要介入並強行取消 Promise,例如在預先輸入搜尋場景的情況下。

那麼,我們可以取消 Promise 嗎?

在現代 JavaScript,殘酷的現實是:。 Promise 目前不支援取消。

我們可以做什麼?

由於無法直接取消 Promise,因此出現了替代方法。

使用取消令牌

取消標記是一種允許您將可取消變數傳遞到函數中的機制。當呼叫令牌時,它會中止操作並拒絕關聯的 Promise。這是一個例子:

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 一樣,提供對Promise 取消的支援以及其他高級功能。

採用最後呼叫模式

此模式確保僅執行函數的最後一次呼叫。它採用令牌方法來取消先前的呼叫:

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