diff --git a/webmail/webmail.js b/webmail/webmail.js index 809471f..af05f61 100644 --- a/webmail/webmail.js +++ b/webmail/webmail.js @@ -1609,6 +1609,7 @@ const newAddressComplete = () => { let completeMatches; let completeSearch; let completeFull; + let aborter = {}; return async function keydown(e) { const target = e.target; if (!datalist) { @@ -1634,14 +1635,21 @@ const newAddressComplete = () => { else if (search === completeSearch) { return; } + if (aborter.abort) { + aborter.abort(); + } + aborter = {}; try { - [completeMatches, completeFull] = await withStatus('Autocompleting addresses', client.CompleteRecipient(search)); + [completeMatches, completeFull] = await withStatus('Autocompleting addresses', client.withOptions({ aborter: aborter }).CompleteRecipient(search)); completeSearch = search; dom._kids(datalist, (completeMatches || []).map(s => dom.option(s))); } catch (err) { log('autocomplete error', errmsg(err)); } + finally { + aborter = {}; + } }; }; const flagList = (miv) => { diff --git a/webmail/webmail.ts b/webmail/webmail.ts index a253c6e..de97712 100644 --- a/webmail/webmail.ts +++ b/webmail/webmail.ts @@ -577,6 +577,8 @@ const newAddressComplete = (): any => { let completeSearch: string let completeFull: boolean + let aborter: {abort?: () => void} = {} + return async function keydown(e: KeyboardEvent) { const target = e.target as HTMLInputElement if (!datalist) { @@ -603,12 +605,18 @@ const newAddressComplete = (): any => { } else if (search === completeSearch) { return } + if (aborter.abort) { + aborter.abort() + } + aborter = {} try { - [completeMatches, completeFull] = await withStatus('Autocompleting addresses', client.CompleteRecipient(search)) + [completeMatches, completeFull] = await withStatus('Autocompleting addresses', client.withOptions({aborter: aborter}).CompleteRecipient(search)) completeSearch = search dom._kids(datalist, (completeMatches || []).map(s => dom.option(s))) } catch (err) { log('autocomplete error', errmsg(err)) + } finally { + aborter = {} } } }