From db17262ea4f7d1736acd842a3afa9f1a19ee39a4 Mon Sep 17 00:00:00 2001 From: Dominik Prokop Date: Tue, 29 Jan 2019 12:10:03 +0100 Subject: [PATCH] Add util for handling promise cancelation to avoid setting state on unmounted components https://github.com/facebook/react/issues/5465 --- public/app/core/utils/CancelablePromise.ts | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 public/app/core/utils/CancelablePromise.ts diff --git a/public/app/core/utils/CancelablePromise.ts b/public/app/core/utils/CancelablePromise.ts new file mode 100644 index 00000000000..e8c3ec07a28 --- /dev/null +++ b/public/app/core/utils/CancelablePromise.ts @@ -0,0 +1,22 @@ +// https://github.com/facebook/react/issues/5465 + +export interface CancelablePromise { + promise: Promise; + cancel: () => void; +} + +export const makePromiseCancelable = (promise: Promise): CancelablePromise => { + 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; + }, + }; +};