Skip to content

Instantly share code, notes, and snippets.

@MoOx
Created August 5, 2016 11:05
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MoOx/e64801b856da0ad930c390aa39ee8505 to your computer and use it in GitHub Desktop.
Save MoOx/e64801b856da0ad930c390aa39ee8505 to your computer and use it in GitHub Desktop.
Way to have cancelable promise
// @flow
// https://facebook.github.io/react/blog/2015/12/16/ismounted-antipattern.html
export type CancelablePromise = {
promise: Promise<any>,
cancel: Function,
}
export const makeCancelablePromise = (
promise: Promise<*>
): CancelablePromise => {
let hasCanceled = false
const wrappedPromise: any = 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(): void {
hasCanceled = true
},
}
}
export const cancelableResolve = (data: any) : CancelablePromise => {
return makeCancelablePromise(Promise.resolve(data))
}
export const cancelableReject = (data: any) : CancelablePromise => {
return makeCancelablePromise(Promise.resolve(data))
}
export default (
promise: Promise<any>,
resolve: (data: any) => void,
reject: (error: string) => void
): CancelablePromise => {
const cancelablePromise = makeCancelablePromise(promise)
cancelablePromise.promise
.then((response) => {
resolve(response.json)
})
.catch((result) => {
const { isCanceled, error } = result
if (isCanceled) {
return
}
reject(error || result)
})
return cancelablePromise
}
@MoOx
Copy link
Author

MoOx commented Aug 5, 2016

const cp = cancelablePromise(fetch(), reject, resolve)
cp.cancel()

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment