UNPKG

@algolia/autocomplete-core

Version:

Core primitives for building autocomplete experiences.

62 lines 1.91 kB
function createInternalCancelablePromise(promise, initialState) { var state = initialState; return { then: function then(onfulfilled, onrejected) { return createInternalCancelablePromise(promise.then(createCallback(onfulfilled, state, promise), createCallback(onrejected, state, promise)), state); }, catch: function _catch(onrejected) { return createInternalCancelablePromise(promise.catch(createCallback(onrejected, state, promise)), state); }, finally: function _finally(onfinally) { if (onfinally) { state.onCancelList.push(onfinally); } return createInternalCancelablePromise(promise.finally(createCallback(onfinally && function () { state.onCancelList = []; return onfinally(); }, state, promise)), state); }, cancel: function cancel() { state.isCanceled = true; var callbacks = state.onCancelList; state.onCancelList = []; callbacks.forEach(function (callback) { callback(); }); }, isCanceled: function isCanceled() { return state.isCanceled === true; } }; } export function createCancelablePromise(executor) { return createInternalCancelablePromise(new Promise(function (resolve, reject) { return executor(resolve, reject); }), { isCanceled: false, onCancelList: [] }); } createCancelablePromise.resolve = function (value) { return cancelable(Promise.resolve(value)); }; createCancelablePromise.reject = function (reason) { return cancelable(Promise.reject(reason)); }; export function cancelable(promise) { return createInternalCancelablePromise(promise, { isCanceled: false, onCancelList: [] }); } function createCallback(onResult, state, fallback) { if (!onResult) { return fallback; } return function callback(arg) { if (state.isCanceled) { return arg; } return onResult(arg); }; }