Skip to content

Instantly share code, notes, and snippets.

@paranoidjk
Created April 18, 2016 07:41
Show Gist options
  • Save paranoidjk/41413d968f62147d8b0e4b8fb87c5f7f to your computer and use it in GitHub Desktop.
Save paranoidjk/41413d968f62147d8b0e4b8fb87c5f7f to your computer and use it in GitHub Desktop.
If you use ES6 promises, you may need to wrap your promise in order to make it cancelable.

facebook/react#5465 (comment)

This simple method can be used to add cancel to any promise

const makeCancelable = (promise) => {
  let hasCanceled_ = false;

  const wrappedPromise = new Promise((resolve, reject) => {
    promise.then((val) =>
      hasCanceled_ ? reject({isCanceled: true}) : resolve(val)
    );
    promise.catch((error) =>
      hasCanceled_ ? reject({isCanceled: true}) : reject(error)
    );
  });

  return {
    promise: wrappedPromise,
    cancel() {
      hasCanceled_ = true;
    },
  };
};

EDIT: Updated for correctness/completeness.

HOW TO USE

const somePromise = new Promise(r => setTimeout(r, 1000));

const cancelable = makeCancelable(somePromise);

cancelable
  .promise
  .then(() => console.log('resolved'))
  .catch(({isCanceled, ...error}) => console.log('isCanceled', isCanceled));

// Cancel promise
cancelable.cancel();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment