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