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.
pull/21833/head
Luke Barnard 2017-07-13 16:51:14 +01:00
parent 7fc10789fc
commit c9f3a12693
1 changed files with 23 additions and 21 deletions

View File

@ -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),
}; };
}); });
} }