Отмена асинхронных процессов

Дегтярев Евгений

Можно ли отменить 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

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