@vtbag/utensil-drawer
Version:
Pull out just what you need to craft seamless transitions. The Utensil Drawer holds reusable functions to help you build websites with view transitions. It is a bit sparse right now, but like the one in your kitchen, it is bound to fill up over time.
30 lines (29 loc) • 1.01 kB
JavaScript
export function createPromiseSubstitute() {
const saved = [];
let delegate;
const save = (kind, resolve, reject, callback) => {
if (delegate) {
return kind === 'then' ? delegate.then(resolve, reject) : delegate.finally(callback);
}
const promise = createPromiseSubstitute();
saved.push({ kind, resolve, reject, callback, promise });
return promise;
};
return {
then(resolve, reject) {
return save('then', resolve, reject);
},
catch(reject) {
return save('then', undefined, reject);
},
finally(callback) {
return save('finally', undefined, undefined, callback);
},
switch(to) {
if (delegate)
throw new Error('Already switched to another promise');
saved.forEach((e) => e.promise.switch(e.kind === 'then' ? to.then(e.resolve, e.reject) : to.finally(e.callback)));
delegate = to;
},
};
}