Отмена асинхронных процессов
Дегтярев Евгений


Можно ли отменить promise?
Отменить promise нельзя
Но если очень хочется то можно
Вариант 1. bluebird
const promise = doSomeWorkAsync();
cancelButton.onclick = function() {
promise.cancel();
};
bluebird 2
function makeCancellableRequest(url) {
var xhr = new XMLHttpRequest;
return new Promise(function (resolve, reject) {
xhr.addEventListener("error", reject);
xhr.addEventListener("load", resolve);
xhr.open("GET", url);
xhr.send(null);
})
.cancellable()
.catch(Promise.CancellationError, e => {
xhr.abort();
throw e;
});
}
bluebird 3
function makeCancellableRequest(url) {
return new Promise((resolve, reject, onCancel)=>{
var xhr = new XMLHttpRequest();
...
onCancel(function() {
xhr.abort();
});
});
}
Особенности
const promiseRoot = doSomeWork1();
const promiseChild1 = promiseRoot.then(doSomeWork2);
const promiseChild2 = promiseRoot.then(doSomeWork3);
promiseChild1.cancel();
Вариант 2. Rx
const subscription = new Rx.Subscription();
const promise = new Promise(resolve => {
const id = setTimeout(resolve, 1000);
subscription.add(() => clearTimeout(id));
});
promise.then(() => console.log('done'));
subcscription.unsubscribe();
Вариант 3.
Другой promsie
CancellationToken
https://github.com/tc39/proposal-cancelable-promises
AbortContoller
https://developer.mozilla.org/en-US/docs/Web/API/AbortController
CancellationToken
function createCancellationTokenSource() {
let cancel = null;
const token = {};
token.promise = new Promise(resolve => {
cancel = (reason) => {
token.reason = reason;
resolve(reason);
});
};
return { token, cancel };
}
function delay(ms, token) {
return new Promise(resolve => {
const id = setTimeout(resolve, ms);
token.promise.then((reason) => clearTimeout(id));
});
};
const source = createCancellationTokenSource();
delay(100, source.token);
source.cancel();
CancellationToken
Js cancellation
By degtep
Js cancellation
- 76