Hayır. Bunu henüz yapamayız.
ES6 vaatleri henüz iptali desteklemiyor . Yolda ve tasarımı birçok insanın üzerinde gerçekten çok çalıştığı bir şey. Ses iptali anlambilimini doğru yapmak zordur ve bu devam eden bir çalışmadır. "Getirme" deposu, esdispus ve GH üzerindeki diğer birkaç repo hakkında ilginç tartışmalar var ama senin yerinde olsam sabırlı olurdum.
Ama, ama, ama .. iptal gerçekten önemli!
İşin gerçeği, iptalin gerçekten istemci tarafı programlamada önemli bir senaryo olmasıdır. Web isteklerini iptal etmek gibi tanımladığınız durumlar önemlidir ve her yerdedir.
Yani ... dil beni mahvetti!
Evet, bunun için üzgünüm. Daha fazla şey belirtilmeden önce vaatlerin girmesi gerekiyordu - bu yüzden .finally
ve gibi bazı yararlı şeyler olmadan girdiler .cancel
- yine de, spesifikasyonlara DOM aracılığıyla geliyor. İptal, sonradan akla gelen bir şey değildir , sadece bir zaman kısıtlaması ve API tasarımına daha yinelemeli bir yaklaşımdır.
Öyleyse ne yapabilirim?
Birkaç alternatifiniz var:
- Spesifikasyondan çok daha hızlı hareket edebilen ve bu nedenle iptal edilebilen ve diğer birçok güzelliğe sahip olan bluebird gibi bir üçüncü taraf kitaplığı kullanın - WhatsApp gibi büyük şirketlerin yaptığı şey budur.
- Bir iptal jetonu iletin .
Üçüncü taraf bir kitaplık kullanmak oldukça açıktır. Bir belirteçle ilgili olarak, yönteminizin bir işlevi almasını ve ardından aşağıdaki gibi çağırmasını sağlayabilirsiniz:
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;
});
};
Hangisi yapmanıza izin verir:
var token = {};
var promise = getWithCancel("/someUrl", token);
token.cancel();
Gerçek kullanım durumunuz - last
Belirteç yaklaşımında bu çok zor değil:
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);
};
}
Hangisi yapmanıza izin verir:
var synced = last(getWithCancel);
synced("/url1?q=a");
synced("/url1?q=ab");
synced("/url1?q=abc");
synced("/url1?q=abcd").then(function() {
});
Ve hayır, Bacon ve Rx gibi kütüphaneler burada "parlamaz" çünkü bunlar gözlemlenebilir kütüphanelerdir, sadece kütüphanelerin spesifikasyona bağlı olmadıkları için kullanıcı seviyesinde vaat ettikleri avantaja sahiptirler. Sanırım ES2016'da gözlemlenebilirler doğal hale geldiğinde görmeyi bekleyeceğiz. Yine de , yazı tipi için şıklar.