вот пишем мы все реквесты на модных промисах, ну типа такого:
function request(url) {
return new Promise(function (resolve, reject) {
var xhr = new XMLHttpRequest;
xhr.open('GET', url);
xhr.onload = resolve;
xhr.onerror = function () {
reject(new Error(xhr.statusText));
};
xhr.send();
});
}
все красиво и замечательно выглядит, колбэковый ад позади, ничто не предвещает беды, и тут вдруг понадобилось выполнять xhr.abort(), но как?! ведь xhr объект мы получим только после окончания загрузки, в голову приходит такое извращение:
function request(url, onBeforeSend) {
return new Promise(function (resolve, reject) {
var xhr = new XMLHttpRequest;
xhr.open('GET', url);
xhr.onload = resolve;
xhr.onerror = function () {
reject(new Error(xhr.statusText));
};
if (onBeforeSend) {
onBeforeSend(xhr);
}
xhr.send();
});
}
request('…', function (xhr) {
…
//в какой-то момент выполняем
xhr.abort();
…
}).then(onFulfilled, onRejected);
вся красота порушена, нет больше идеального мира
но это еще не все, дальше возникает вопрос, что делать после abort, выполнять onRejected или оставлять промис зависшим?