in src/SyncTasks.ts [644:691]
export function race<T1, T2, T3, T4, T5>(
values: [Raceable<T1>, Raceable<T2>, Raceable<T3>, Raceable<T4>, Raceable<T5>]): STPromise<T1|T2|T3|T4|T5>;
export function race<T1, T2, T3, T4>(values: [Raceable<T1>, Raceable<T2>, Raceable<T3>, Raceable<T4>]): STPromise<T1|T2|T3|T4>;
export function race<T1, T2, T3>(values: [Raceable<T1>, Raceable<T2>, Raceable<T3>]): STPromise<T1|T2|T3>;
export function race<T1, T2>(values: [Raceable<T1>, Raceable<T2>]): STPromise<T1|T2>;
export function race<T>(values: (T | Thenable<T>)[]): STPromise<T[]>;
export function race(items: any[]): STPromise<any> {
const outTask = Defer<any>();
let hasSettled = false;
outTask.onCancel((val) => {
items.forEach(item => {
if (isCancelable(item)) {
Internal.SyncTask.cancelOtherInternal(item, val);
}
});
});
items.forEach(item => {
if (isThenable(item)) {
const task = item as Thenable<any>;
task.then(res => {
if (!hasSettled) {
hasSettled = true;
outTask.resolve(res);
}
}, err => {
if (!hasSettled) {
hasSettled = true;
outTask.reject(err);
}
});
} else {
// Not a task, so resolve directly with the item
if (!hasSettled) {
hasSettled = true;
outTask.resolve(item);
}
}
});
return outTask.promise();
}