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,21 +52,23 @@ export async function getCompletions(query: string, selection: SelectionRange, f
otherwise, we run into a condition where new completions are displayed
while the user is interacting with the list, which makes it difficult
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
state (== "fulfilled" || "rejected") and value. */
const completionsList = await Q.allSettled(
PROVIDERS.map(provider => {
return Promise.resolve(provider.getCompletions(query, selection, force))
.timeout(PROVIDER_COMPLETION_TIMEOUT);
}),
*/
const completionsList = await Promise.all(
// Array of inspections of promises that might timeout. Instead of allowing a
// single timeout to reject the Promise.all, reflect each one and once they've all
// settled, filter for the fulfilled ones
PROVIDERS.map((provider) => {
// 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
.filter(completion => completion.state === "fulfilled")
.map((completionsState, i) => {
return completionsList.filter(
(inspection) => inspection.isFulfilled(),
).map((completionsState, i) => {
return {
completions: completionsState.value,
completions: completionsState.value(),
provider: PROVIDERS[i],
/* the currently matched "command" the completer tried to complete