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