modern-async
Version:
A modern tooling library for asynchronous operations using async/await, promises and async generators
49 lines (45 loc) • 1.48 kB
JavaScript
import Deferred from './Deferred.mjs'
import CancelledError from './CancelledError.mjs'
import setImmediate from 'core-js-pure/features/set-immediate.js'
import clearImmediate from 'core-js-pure/features/clear-immediate.js'
/**
* A function returning a promise that will be resolved in a later tick of the event loop.
*
* This function returns both a promise and cancel function in order to cancel the wait time if
* necessary. If cancelled, the promise will be rejected with a CancelledError.
*
* This function uses core-js' shim for `setImmediate()` internally.
*
* @returns {Array} A tuple of two objects:
* * The promise
* * The cancel function. It will return a boolean that will be true if the promise was effectively cancelled,
* false otherwise.
* @example
* import { asyncDelayCancellable, CancelledError } from 'modern-async'
*
* const [promise, cancel] = asyncDelayCancellable()
* cancel()
* try {
* await promise
* } catch (e) {
* console.log(e instanceof CancelledError) // prints true
* }
*/
function asyncDelayCancellable () {
const deferred = new Deferred()
const id = setImmediate(deferred.resolve)
let terminated = false
return [deferred.promise.finally(() => {
terminated = true
}), () => {
if (terminated) {
return false
} else {
terminated = true
deferred.reject(new CancelledError())
clearImmediate(id)
return true
}
}]
}
export default asyncDelayCancellable