📄 createTemplatePromise¶
📊 Analysis Summary¶
| Metric | Count |
|---|---|
| 🔧 Functions | 6 |
| 📦 Imports | 9 |
| ⚡ Async/Await Patterns | 2 |
| 📐 Interfaces | 2 |
| 📑 Type Aliases | 1 |
📚 Table of Contents¶
🛠️ File Location:¶
📂 packages/core/createTemplatePromise/index.ts
📦 Imports¶
| Name | Source |
|---|---|
DefineComponent |
vue |
Ref |
vue |
TransitionGroupProps |
vue |
deepRef |
vue |
defineComponent |
vue |
Fragment |
vue |
h |
vue |
shallowReactive |
vue |
TransitionGroup |
vue |
Async/Await Patterns¶
| Type | Function | Await Expressions | Promise Chains |
|---|---|---|---|
| promise-chain | createTemplatePromise |
none | new Promise |
| promise-chain | create |
none | new Promise |
Functions¶
createTemplatePromise(options: TemplatePromiseOptions): TemplatePromise<Return, Args>¶
Creates a template promise component.
See: https://vueuse.org/createTemplatePromise
Tags: @__NO_SIDE_EFFECTS__
Raw JSDoc
Calls:
deepRef (from vue)shallowReactive (from vue)instances.value.pushnew Promise<Return>((_resolve, _reject) => { props.resolve = (v) => { props.isResolving = true return _resolve(v) } props.reject = _reject }) .finally_resolveinstances.value.indexOfinstances.value.splicecreatedefineComponent (from vue)instances.value.maph (from vue)slots.default
Internal Comments:
// @ts-expect-error There's a breaking type change in Vue 3.3 <https://github.com/vuejs/core/pull/7963> (x4)
Code
export function createTemplatePromise<Return, Args extends any[] = []>(
options: TemplatePromiseOptions = {},
): TemplatePromise<Return, Args> {
let index = 0
const instances = deepRef([]) as Ref<TemplatePromiseProps<Return, Args>[]>
function create(...args: Args) {
const props = shallowReactive({
key: index++,
args,
promise: undefined,
resolve: () => {},
reject: () => {},
isResolving: false,
options,
}) as TemplatePromiseProps<Return, Args>
instances.value.push(props)
props.promise = new Promise<Return>((_resolve, _reject) => {
props.resolve = (v) => {
props.isResolving = true
return _resolve(v)
}
props.reject = _reject
})
.finally(() => {
props.promise = undefined
const index = instances.value.indexOf(props)
if (index !== -1)
instances.value.splice(index, 1)
})
return props.promise
}
function start(...args: Args) {
if (options.singleton && instances.value.length > 0)
return instances.value[0].promise
return create(...args)
}
const component = defineComponent((_, { slots }) => {
const renderList = () => instances.value.map(props => h(Fragment, { key: props.key }, slots.default?.(props)))
if (options.transition)
return () => h(TransitionGroup, options.transition, renderList)
return renderList
})
// @ts-expect-error There's a breaking type change in Vue 3.3 <https://github.com/vuejs/core/pull/7963>
component.start = start
return component as TemplatePromise<Return, Args>
}
Internal helpers¶
Declared inside another function in this file.
create(args: Args): Promise<Return>¶
Parameters:
argsArgs
Returns: Promise<Return>
Calls:
shallowReactive (from vue)instances.value.pushnew Promise<Return>((_resolve, _reject) => { props.resolve = (v) => { props.isResolving = true return _resolve(v) } props.reject = _reject }) .finally_resolveinstances.value.indexOfinstances.value.splice
Code
function create(...args: Args) {
const props = shallowReactive({
key: index++,
args,
promise: undefined,
resolve: () => {},
reject: () => {},
isResolving: false,
options,
}) as TemplatePromiseProps<Return, Args>
instances.value.push(props)
props.promise = new Promise<Return>((_resolve, _reject) => {
props.resolve = (v) => {
props.isResolving = true
return _resolve(v)
}
props.reject = _reject
})
.finally(() => {
props.promise = undefined
const index = instances.value.indexOf(props)
if (index !== -1)
instances.value.splice(index, 1)
})
return props.promise
}
resolve(): void¶
Returns: void
reject(): void¶
Returns: void
start(args: Args): any¶
Parameters:
argsArgs
Returns: any
Calls:
create
Code
renderList(): any¶
Returns: any
Calls:
instances.value.map
Interfaces¶
TemplatePromiseProps<Return, Args extends any[] = []>¶
Interface Code
export interface TemplatePromiseProps<Return, Args extends any[] = []> {
/**
* The promise instance.
*/
promise: Promise<Return> | undefined
/**
* Resolve the promise.
*/
resolve: (v: Return | Promise<Return>) => void
/**
* Reject the promise.
*/
reject: (v: any) => void
/**
* Arguments passed to TemplatePromise.start()
*/
args: Args
/**
* Indicates if the promise is resolving.
* When passing another promise to `resolve`, this will be set to `true` until the promise is resolved.
*/
isResolving: boolean
/**
* Options passed to createTemplatePromise()
*/
options: TemplatePromiseOptions
/**
* Unique key for list rendering.
*/
key: number
}
Properties¶
| Name | Type | Optional | Description |
|---|---|---|---|
promise |
Promise<Return> \| undefined |
✗ | not shown |
resolve |
(v: Return \| Promise<Return>) => void |
✗ | not shown |
reject |
(v: any) => void |
✗ | not shown |
args |
Args |
✗ | not shown |
isResolving |
boolean |
✗ | not shown |
options |
TemplatePromiseOptions |
✗ | not shown |
key |
number |
✗ | not shown |
TemplatePromiseOptions¶
Interface Code
Properties¶
| Name | Type | Optional | Description |
|---|---|---|---|
singleton |
boolean |
✓ | not shown |
transition |
TransitionGroupProps |
✓ | not shown |
Type Aliases¶
TemplatePromise<Return, Args extends any[] = []>¶
type TemplatePromise<Return, Args extends any[] = []> = DefineComponent<object> & {
new(): {
$slots: {
default: (_: TemplatePromiseProps<Return, Args>) => any
}
}
} & {
start: (...args: Args) => Promise<Return>
};
Generated by Syntax Scribe