You can write this quite easily on your own.
function raceToSuccess(promises) {
return new Promise(
resolve =>
promises.forEach(
promise =>
promise.then(resolve)
)
);
}
This will let go of all the promises, and when either of them succeeds in resolving a new promise with its meaning. Error promises are ignored. Subsequent successful promises do not cause anything because a new promise has already been resolved. Note that the promise received will never allow or will not be rejected if none of the input promises allow.
, , promises :
function raceToSuccess(promises) {
let numRejected = 0;
return new Promise(
(resolve, reject) =>
promises.forEach(
promise =>
promise .
then(resolve) .
catch(
() => {
if (++numRejected === promises.length) reject();
}
)
)
);
}
@loganfsmyth; , , . :
function invertPromise(promise) {
return new Promise(
(resolve, reject) =>
promise.then(reject, resolve)
);
}
function raceToSuccess(promises) {
return invertPromise(
Promise.all(
promises.map(invertPromise)));
}
, promises promises, ( , ), Promise.race:
function pendingPromise() { return new Promise(() => { }); }
function killRejected(promise) { return promise.catch(pendingPromise); }
function raceToSuccess(promises) {
return Promise.race(promises.map(killRejected));
}
. , promises . , promises GC'd, .
user663031