Вы можете создать два Promises
и поместить их resolve
в массив.Когда один ответ возвращается, pop()
один из resolve
s и позвоните ему.Повторите для второго ответа.Дальнейшие ответы можно игнорировать, поскольку массив теперь пуст.
Затем вы можете вызвать Promise.all
для двух построенных Обещаний, которые разрешатся, когда будут вызваны оба resolve
s.
const api = () => new Promise(res => {
const timeout = Math.random() * 3000;
setTimeout(() => {
console.log('resolving ' + timeout);
res(timeout);
}, timeout)
});
const resolves = [];
const prom1 = new Promise(resolve => resolves.push(resolve));
const prom2 = new Promise(resolve => resolves.push(resolve));
for (let i = 0; i < 10; i++) {
api().then(res => {
if (!resolves.length) return;
resolves.pop()(res);
});
}
Promise.all([prom1, prom2])
.then(([res1, res2]) => {
console.log('got 2 responses', res1, res2);
});
Как видно из приведенного выше кода, хотя последние вызовы API с 3 по 10 разрешаются, Promise.all
разрешается, как только первое и второе самое быстрое решение.