in src/SyncTasks.ts [655:691]
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();
}