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

时间:2017-11-03 11:27:36

标签: javascript asynchronous promise cancellation

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

例如:

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!

2 个答案:

答案 0 :(得分:1)

您可以向您的承诺发送令牌,以便稍后取消。

class Post
    before_destroy :update_tasks

    private

    def update_tasks
        self.tasks.update_all(post_id: nil)
    end
end

以下是工作链接:https://jsfiddle.net/Lwymeoz0/

答案 1 :(得分:0)

Promise不是可以取消或停止的独立进程。如果有一个计时器在其中一个中运行,它将继续这样做,除非你自己停止它。

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

这样的事情应该有效:

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]);
    }
})