2017-01-22 71 views
0

在TypeScript中,我创建了大约100个Promise实例,这些实例都可以解决或拒绝。但我只需要等待其中的5个解决,那么其余的必须取消(如果可能),因为他们做的工作不再需要。如果取消不可能,拒绝其他人也可以。如何等待m个承诺解决,取消其余的?

这怎么办?

+0

[Bluebird's'Promise.some()'](http://bluebirdjs.com/docs/api/promise.some.html)就是为此而设计的。它就像'Promise.all()',但是你传递了你想要等待的许多承诺。首先N到终点触发它(在哪里你决定N是什么)。 – jfriend00

回答

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

这并假定你的承诺都返回相同的类型,但是你可以很容易地通过一个联合类型,任何或void根据您的需要。

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

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

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