Skip to content

Commit f5c60c1

Browse files
committed
feat(core/utils): add callUntilEnd, callPromiseUntilEnd
1 parent 4b90bb7 commit f5c60c1

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

packages/core/src/utils/basic.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import _dev from "../dev";
2+
3+
export async function callUntilEnd<T extends boolean>(
4+
func: T extends true
5+
? (end: () => boolean) => Promise<void | boolean>
6+
: (end: () => boolean) => void | boolean,
7+
timeout: number,
8+
immediate: boolean = false,
9+
promise: T = false as T
10+
): Promise<void> {
11+
return new Promise((resolve, reject) => {
12+
let end = false;
13+
const endFunc = () => end;
14+
15+
setTimeout(callFunc, immediate ? 0 : timeout);
16+
17+
async function callFunc() {
18+
try {
19+
end = promise ? !!(await func(endFunc)) : !!func(endFunc);
20+
// Don't use else, using else can't detect is endFunc called, it can only detect is func returns true
21+
if (!end) {
22+
setTimeout(callFunc, timeout);
23+
} else resolve();
24+
} catch (error: any) {
25+
if (__DEV__) {
26+
_dev.warn(
27+
"fastjs/utils/doUntilEnd",
28+
"An error occurred while executing the function",
29+
error
30+
);
31+
}
32+
reject(error);
33+
end = true;
34+
}
35+
}
36+
});
37+
}
38+
39+
export function callPromiseUntilEnd(
40+
func: (end: () => boolean) => Promise<void | boolean>,
41+
timeout: number = 1000,
42+
immediate: boolean = false
43+
): Promise<void> {
44+
return new Promise((resolve) => {
45+
callUntilEnd(func, timeout, immediate, true).then(resolve);
46+
});
47+
}

packages/core/src/utils/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
import * as basic from "./basic";
12
import * as dom from "./dom";
23
import * as rand from "./rand";
34

45
export default {
6+
...basic,
57
...dom,
68
...rand
79
};
810
export * from "./dom";
911
export * from "./rand";
12+
export * from "./basic";

0 commit comments

Comments
 (0)