Вы должны иметь идентификаторы тайм-аута где-нибудь, где их может увидеть противоположное обещание.Затем, когда первое обещание разрешается, вы отменяете время ожидания other one.
Вот упрощенная версия без ajax:
function myFunction() {
var id1, id2 // ids in outer scope
var timeout1 = new Promise(function(resolve, reject) {
id1 = setTimeout(function() {
clearTimeout(id2); // clear the *other* timeout
resolve("Timed out2");
}, 1000);
});
var timeout2 = new Promise(function(resolve, reject) {
id2 = setTimeout(function() {
console.log("timeout finished")
clearTimeout(id1);
reject(Error("Timed out"));
}, 1500);
});
return Promise.race([timeout1, timeout2]);
}
myFunction().then(console.log).catch(console.log)
Это приведет к тому, что одно из обещаний никогда не будет выполнено, но до тех пор, пока у вас нет ссылки на , оно должно быть собрано для мусора .