いいえ、まだできません。
ES6の約束はまだキャンセルをサポートしていません。それはその途上にあり、そのデザインは多くの人々が本当に一生懸命取り組んだものです。サウンドキャンセルのセマンティクスを正しく理解するのは困難であり、これは進行中の作業です。「フェッチ」レポ、エスディスカス、およびGHに関する他のいくつかのレポについては興味深い議論がありますが、私があなただったら辛抱強く待ってください。
しかし、しかし、しかし..キャンセルは本当に重要です!
つまり、問題の現実は、キャンセルがクライアント側のプログラミングにおいて本当に重要なシナリオであるということです。Webリクエストを中止するように説明するケースは重要であり、どこにでもあります。
だから...言語は私を台無しにした!
ええ、それについては申し訳ありません。彼らはのようないくつかの有用なものなしに行ってきましたので、 -約束はさらに、物事が指定された前に、最初に取得しなければならなかった.finally
と.cancel
-それはDOMを通じてスペックに、かかわらず、その途中にあります。キャンセルは後から考えたものではなく、時間の制約であり、API設計に対するより反復的なアプローチです。
じゃあどうすればいい?
いくつかの選択肢があります。
- ブルーバードのようなサードパーティのライブラリを使用してください。このライブラリは、仕様よりもはるかに高速に移動できるため、キャンセルやその他の多くの機能があります。これは、WhatsAppのような大企業が行っていることです。
- キャンセルトークンを渡します。
サードパーティのライブラリを使用することは非常に明白です。トークンについては、メソッドに関数を取り込んでから、次のように呼び出すことができます。
function getWithCancel(url, token) {
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);
token.cancel();
実際のユースケース- last
これは、トークンアプローチではそれほど難しくありません。
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");
synced("/url1?q=ab");
synced("/url1?q=abc");
synced("/url1?q=abcd").then(function() {
});
いいえ、BaconやRxのようなライブラリは、観察可能なライブラリであるため、ここでは「輝き」ません。仕様に縛られないことで、ユーザーレベルの約束と同じ利点があります。ES2016でオブザーバブルがネイティブになるのを待ち、見るのを待つと思います。しかし、それらは先行入力には気の利いたものです。