Fix Autocompleter promises
Use bluebird instead of the now removed "q" library. Also, make sure we timeout and then `reflect` to effectively do an `allSettled` that waits for all promises to either be resolved or rejected. Then we filter for those that are fulfilled and return the completions.
This commit is contained in:
parent
7fc10789fc
commit
c9f3a12693
1 changed files with 23 additions and 21 deletions
|
@ -52,28 +52,30 @@ export async function getCompletions(query: string, selection: SelectionRange, f
|
||||||
otherwise, we run into a condition where new completions are displayed
|
otherwise, we run into a condition where new completions are displayed
|
||||||
while the user is interacting with the list, which makes it difficult
|
while the user is interacting with the list, which makes it difficult
|
||||||
to predict whether an action will actually do what is intended
|
to predict whether an action will actually do what is intended
|
||||||
|
*/
|
||||||
It ends up containing a list of Q promise states, which are objects with
|
const completionsList = await Promise.all(
|
||||||
state (== "fulfilled" || "rejected") and value. */
|
// Array of inspections of promises that might timeout. Instead of allowing a
|
||||||
const completionsList = await Q.allSettled(
|
// single timeout to reject the Promise.all, reflect each one and once they've all
|
||||||
PROVIDERS.map(provider => {
|
// settled, filter for the fulfilled ones
|
||||||
return Promise.resolve(provider.getCompletions(query, selection, force))
|
PROVIDERS.map((provider) => {
|
||||||
.timeout(PROVIDER_COMPLETION_TIMEOUT);
|
// Convert to bluebird promise so that we can do a timeout
|
||||||
}),
|
const p = Promise.resolve(provider.getCompletions(query, selection, force));
|
||||||
|
return p.timeout(PROVIDER_COMPLETION_TIMEOUT);
|
||||||
|
}).map((p) => p.reflect()),
|
||||||
);
|
);
|
||||||
|
|
||||||
return completionsList
|
return completionsList.filter(
|
||||||
.filter(completion => completion.state === "fulfilled")
|
(inspection) => inspection.isFulfilled(),
|
||||||
.map((completionsState, i) => {
|
).map((completionsState, i) => {
|
||||||
return {
|
return {
|
||||||
completions: completionsState.value,
|
completions: completionsState.value(),
|
||||||
provider: PROVIDERS[i],
|
provider: PROVIDERS[i],
|
||||||
|
|
||||||
/* the currently matched "command" the completer tried to complete
|
/* the currently matched "command" the completer tried to complete
|
||||||
* we pass this through so that Autocomplete can figure out when to
|
* we pass this through so that Autocomplete can figure out when to
|
||||||
* re-show itself once hidden.
|
* re-show itself once hidden.
|
||||||
*/
|
*/
|
||||||
command: PROVIDERS[i].getCurrentCommand(query, selection, force),
|
command: PROVIDERS[i].getCurrentCommand(query, selection, force),
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue