ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScript で約束を強制的にキャンセルできますか?

JavaScript で約束を強制的にキャンセルできますか?

Barbara Streisand
リリース: 2024-10-30 15:09:03
オリジナル
426 人が閲覧しました

 Can We Forcefully Cancel Promises in JavaScript?

Promise: 本当にキャンセルを強制できますか?

ES6 で導入された Promise は、非同期プログラミングへのアプローチを変えました。ただし、先行入力検索シナリオの場合など、介入して約束を強制的にキャンセルする必要がある状況もあります。

So, Can We Cancel a 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 キャンセルのサポートを提供します。

Last-Invoke パターンを採用

このパターンでは、関数の最後の呼び出しのみが実行されることが保証されます。以前の呼び出しをキャンセルするためにトークン アプローチを採用しています:

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 で約束を強制的にキャンセルできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート