Javascript 如何在一个承诺完成后阻止其他承诺

Javascript 如何在一个承诺完成后阻止其他承诺,javascript,asynchronous,promise,cancellation,Javascript,Asynchronous,Promise,Cancellation,我有一个异步函数列表。我希望当第一个函数解析(或拒绝)时,我可以阻止其他函数 例如: function wait(ms){ return new Promise(function(resolve){ setTimeout(function(){ console.log('waited ', ms); resolve(); }, ms); }) } promise1 = wait(2000); pro

我有一个异步函数列表。我希望当第一个函数解析(或拒绝)时,我可以阻止其他函数

例如:

function wait(ms){
    return new Promise(function(resolve){
        setTimeout(function(){
            console.log('waited ', ms);
            resolve();
        }, ms);
    })
}

promise1 = wait(2000);
promise2 = wait(5000);

listPromise = [promise1, promise2];

Promise.race(listPromise).then(function(){
    console.log("Very first promise has resolved!");
})
实际结果是:

> waited  2000
> Very first promise has resolved!
> waited  5000
> waited  2000
> Very first promise has resolved!
预期结果是:

> waited  2000
> Very first promise has resolved!
> waited  5000
> waited  2000
> Very first promise has resolved!

承诺不是可以取消或停止的独立流程。如果其中一个计时器正在运行,它将继续运行,除非您自己停止

要解决您的特定问题,您需要跟踪当前正在运行的超时,并且在解决第一个超时后,清除所有其他超时

像这样的方法应该会奏效:

var timeoutIds = [];

function wait(ms){
    return new Promise(function(resolve){
        var timeoutId = setTimeout(function(){
            console.log('waited ', ms);
            resolve();
        }, ms);
        timeoutIds.push(timeoutId);
    })
}

promise1 = wait(2000);
promise2 = wait(5000);

listPromise = [promise1, promise2];

Promise.race(listPromise).then(function(){
    console.log("Very first promise has resolved!");

    for (var i = 0; i < timeoutIds.length; i++) {
        clearTimeout(timeoutIds[i]);
    }
})
var timeoutIds=[];
函数等待(毫秒){
返回新承诺(函数(解析){
var timeoutId=setTimeout(函数(){
console.log('waited',ms);
解决();
},ms);
timeoutId.push(timeoutId);
})
}
承诺1=等待(2000年);
承诺2=等待(5000);
listPromise=[promise1,promise2];
Promise.race(listPromise).then(function(){
log(“第一个承诺已经解决!”);
对于(var i=0;i
您可以向您的承诺发送一个令牌,以便稍后取消承诺

函数等待(ms、令牌){
返回新承诺(函数(解析){
var t=setTimeout(函数(){
console.log('waited',ms);
解决();
},ms);
token.cancel=函数(){
清除超时(t);
}
})
}
var标记=[{},{},{}];
承诺1=等待(3000,代币[0]);
允诺2=等待(2000,代币[1]);
承诺3=等待(5000,代币[2]);
listPromise=[promise1,promise2,promise3];
var p=Promise.race(listPromise).then(function(){
log(“第一个承诺已经解决!”);
for(var i=0;i})
当第一个承诺解析时,您想取消其他承诺的执行并可能执行清理,还是不想让它们调用回调方法,但它们的执行会继续,尽管您不关心它们的返回值?请看哪一个很好地解释了如何处理这两种情况。感谢您提供的解决方案,但我指的是每个异步函数,而不仅仅是特定的setTimeout。我在Svenskunganka的参考资料中找到了答案。@LittleZero,是的,这个解决方案专门用于超时,但对于其他操作,它将是类似的。您将保留一个实例,例如,fetch操作,并对其调用“cancel”。