「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > JavaScript で約束を強制的にキャンセルできますか?

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

2024 年 11 月 24 日に公開
ブラウズ:652

 Can We Forcefully Cancel Promises in JavaScript?

Promises: Can We Really Force cancel?

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

So, Can We Cancel a Promise?

In最新の 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 などのライブラリは、他の高度な機能とともに、約束のキャンセルのサポートを提供します。

最終呼び出しパターンを採用する

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

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