8000 fix: missing set removing state · yjl9903/memofunc@cb81942 · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Commit cb81942

Browse files
committed
fix: missing set removing state
1 parent 81fe265 commit cb81942

File tree

2 files changed

+33
-25
lines changed

2 files changed

+33
-25
lines changed

src/external.ts

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export function memoExternal<F extends AsyncFn>(
2828
} else {
2929
try {
3030
// Waiting or Removing
31-
if (cur.state === State.Removing) {
31+
while (cur.state === State.Removing) {
3232
await new Promise<void>((res) => {
3333
if (!cur.removingCallbacks) {
3434
cur.removingCallbacks = new Set();
@@ -90,33 +90,41 @@ export function memoExternal<F extends AsyncFn>(
9090
const cur = walkOrBreak<F, any[]>(root, path);
9191

9292
if (cur) {
93-
if (cur.state === State.Waiting) {
94-
await new Promise((res) => {
95-
if (!cur.callbacks) {
96-
cur.callbacks = new Set();
97-
}
98-
// Ignore error
99-
cur.callbacks!.add({ res, rej: () => {} });
100-
});
101-
} else if (cur.state === State.Removing) {
102-
await new Promise<void>((res) => {
103-
if (!cur.removingCallbacks) {
104-
cur.removingCallbacks = new Set();
105-
}
106-
// Ignore error
107-
cur.removingCallbacks!.add({ res, rej: () => {} });
108-
});
93+
while (cur.state === State.Waiting || cur.state === State.Removing) {
94+
if (cur.state === State.Waiting) {
95+
await new Promise((res) => {
96+
if (!cur.callbacks) {
97+
cur.callbacks = new Set();
98+
}
99+
// Ignore error
100+
cur.callbacks!.add({ res, rej: () => {} });
101+
});
102+
} else if (cur.state === State.Removing) {
103+
await new Promise<void>((res) => {
104+
if (!cur.removingCallbacks) {
105+
cur.removingCallbacks = new Set();
106+
}
107+
// Ignore error
108+
cur.removingCallbacks!.add({ res, rej: () => {} });
109+
});
110+
}
109111
}
110112

111-
await options.external.remove
112-
.bind(memoFunc)(args as Parameters<F>)
113-
.catch(options.external?.error ?? (() => undefined));
113+
try {
114+
cur.state = State.Removing;
115+
116+
await options.external.remove
117+
.bind(memoFunc)(args as Parameters<F>)
118+
.catch(options.external?.error ?? (() => undefined));
114119

115-
// Resolve other waiting callbacks
116-
for (const callback of cur.removingCallbacks ?? []) {
117-
callback.res();
120+
// Resolve other waiting callbacks
121+
for (const callback of cur.removingCallbacks ?? []) {
122+
callback.res();
123+
}
124+
cur.removingCallbacks = undefined;
125+
} finally {
126+
cur.state = State.Empty;
118127
}
119-
cur.removingCallbacks = undefined;
120128
}
121129
};
122130

test/memo.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ describe('memo external', () => {
236236
func(),
237237
func()
238238
]);
239-
expect(tasks2).toStrictEqual([undefined, 1, 1, 1, undefined, 1, 1]);
239+
expect(tasks2).toStrictEqual([undefined, 1, 2, 3, undefined, 4, 5]);
240240
});
241241
});
242242

0 commit comments

Comments
 (0)
0