如何等待m个承诺得到解决,取消其余的?

时间:2017-01-22 21:10:51

标签: typescript promise

在TypeScript中,我创建了大约100个Promise个实例,这些实例都可能被解析或拒绝。但我只需等待其中5个已解决,其余部分必须取消(如果可能),因为它们不再需要工作。如果取消是不可能的,拒绝其余的也没关系。

如何做到这一点?

1 个答案:

答案 0 :(得分:2)

我相信这个功能应该这样做。

export function execSome<T>(arr: Promise<T>[], limit:number) {
    let boxedLimit = Math.min(limit, arr.length);
    let results :T[] = [];

    return new Promise((resolve, reject) => {
        function onComplete(result:T) {
            if (results.length === boxedLimit - 1) {
                resolve(results.concat([result]));
            } else {
                results.push(result);
            }
        }
        arr.forEach(promise => promise.then(onComplete).catch(reject));
    })
}

这假设您的承诺都返回相同类型,但您可以根据需要轻松传入联合类型,任何或无效。

基本思路是将每个promise添加到他们都有权访问的数组中。如果当前承诺将满足要求,请继续使用公共结果数组解决整体承诺。如果您传入数字,我们需要boxedLimit。您可以通过传递100个承诺的数组来使用此值,其中5为限制。

据我所知there is no feasible way of canceling an ES6 promise所以我没有打扰。

您可能会觉得onComplete函数的结构有点奇怪。使用异步代码时,我更喜欢只有一个修改共享状态的代码路径。