Недавно я столкнулся с этим сценарием, где мне пришлось сделать кучу API звонков с моего сервера, вернуть самый быстрый ответ и выполнять некоторую почтусную обработку по всем ответам.
Начать с того, что я подумал об использовании обещания. Race (), но, как вы можете знать, обещают. () возвращает только результат первого обещания, который выполняет или отклоняет. Очевидно, что это не будет работать так, как мы решаем это? 🤔
Вот как я пошел о ее решении.
Предположим, у нас есть массив обещаний
const promises = [promise1, promise2,....];
Объявить класс обертки
class RacePromiseWrapper {
private callWithRaceWinner: (result: Result)=>void;
private results: Result[];
private hasFirstReturned = false;
constructor(callWithRaceWinner) {
this.callWithRaceWinner = callWithRaceWinner;
}
onResolve = (result: Result):void => {
if (!this.hasFirstReturned) {
this.hasFirstReturned = true;
this.callWithRaceWinner(result);
}
this.results.push(result);
};
getResults(): Result[] {
// any post processing you'd like to do
return results;
}
}
Здесь вы можете увидеть класс поддерживает переменную поля HASFIRSTRETHOND, которая используется для вызова функции с результатом первого обещания, которое разрешается.
Объявить функцию async следующим образом
const getAllResultsWithRacing = async (promises, callWithRaceWinner) => {
RacePromiseWrapper wrapper = new RacePromiseWrapper(callWithRaceWinner);
promises.map((promise)=>promises.then(wrapper.onResolve));
await Promise.all(promises);
return wrapper.getResults();
}
Теперь вы можете использовать эту функцию как таковую гонку обещаний, не отказавшись от результатов обещаний
const results = await getAllResultsWithRacing(promises, (firstResult) => {
//do something with firstResult
};
results.map((result)=> {
//do something with all of the results
}
Думаю, что есть лучший способ сделать это? Дайте мне знать в комментариях.
Оригинал: “https://dev.to/msandeep96/racing-promises-without-discarding-the-results-21n6”