Skip to content

Commit 141d15c

Browse files
committed
wip: await all run qrls in wait_for_all
1 parent 728d5b7 commit 141d15c

File tree

3 files changed

+24
-10
lines changed

3 files changed

+24
-10
lines changed

packages/qwik/src/core/shared/qrl/qrl-class.ts

+10-6
Original file line numberDiff line numberDiff line change
@@ -138,14 +138,18 @@ export const createQRL = <TYPE>(
138138
return fn;
139139
}
140140
return function (this: unknown, ...args: QrlArgs<TYPE>) {
141-
let context = tryGetInvokeContext();
142-
if (context) {
143-
return fn.apply(this, args);
144-
}
145-
context = newInvokeContext();
141+
const context = tryGetInvokeContext() || newInvokeContext();
142+
const prevQrl = context.$qrl$;
143+
const prevEvent = context.$event$;
146144
context.$qrl$ = qrl;
145+
// TODO do we use this?
147146
context.$event$ = this as Event;
148-
return invoke.call(this, context, fn as any, ...args);
147+
try {
148+
return invoke.call(this, context, fn as any, ...args);
149+
} finally {
150+
context.$qrl$ = prevQrl;
151+
context.$event$ = prevEvent;
152+
}
149153
} as TYPE;
150154
};
151155

packages/qwik/src/core/shared/scheduler.ts

+13-3
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ export const createScheduler = (
177177
journalFlush: () => void
178178
) => {
179179
const choreQueue: Chore[] = [];
180+
const qrlRuns: Promise<any>[] = [];
180181

181182
let currentChore: Chore | null = null;
182183
let drainScheduled: boolean = false;
@@ -323,6 +324,9 @@ export const createScheduler = (
323324
}
324325
executeChore(nextChore, isServer);
325326
if (nextChore === runUptoChore) {
327+
if (nextChore.$type$ === ChoreType.WAIT_FOR_ALL && qrlRuns.length) {
328+
return Promise.all(qrlRuns).then(() => drainUpTo(runUptoChore, isServer));
329+
}
326330
break;
327331
}
328332
}
@@ -399,9 +403,15 @@ export const createScheduler = (
399403
try {
400404
const result = retryOnPromise(() => fn(...(chore.$payload$ as unknown[])));
401405
if (isPromise(result)) {
402-
result.catch((error) => {
403-
emitEvent('qerror', { error });
404-
});
406+
qrlRuns.push(
407+
result
408+
.catch((error) => {
409+
emitEvent('qerror', { error });
410+
})
411+
.then(() => {
412+
qrlRuns.splice(qrlRuns.indexOf(result), 1);
413+
})
414+
);
405415
}
406416
} catch (error) {
407417
emitEvent('qerror', { error });

packages/qwik/src/core/shared/utils/promises.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ export function retryOnPromise<T>(
111111
fn: () => ValueOrPromise<T>,
112112
retryCount: number = 0
113113
): ValueOrPromise<T> {
114-
const retryOrThrow = (e: any) => {
114+
const retryOrThrow = (e: any): ValueOrPromise<T> => {
115115
if (isPromise(e) && retryCount < MAX_RETRY_ON_PROMISE_COUNT) {
116116
return e.then(retryOnPromise.bind(null, fn, retryCount++)) as ValueOrPromise<T>;
117117
}

0 commit comments

Comments
 (0)