0
在TypeScript中,我创建了大约100个Promise
实例,这些实例都可以解决或拒绝。但我只需要等待其中的5个解决,那么其余的必须取消(如果可能),因为他们做的工作不再需要。如果取消不可能,拒绝其他人也可以。如何等待m个承诺解决,取消其余的?
这怎么办?
在TypeScript中,我创建了大约100个Promise
实例,这些实例都可以解决或拒绝。但我只需要等待其中的5个解决,那么其余的必须取消(如果可能),因为他们做的工作不再需要。如果取消不可能,拒绝其他人也可以。如何等待m个承诺解决,取消其余的?
这怎么办?
我相信这个功能应该这样做。
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函数的结构有点奇怪。在使用异步代码时,我更喜欢只有一个修改共享状态的代码路径。
[Bluebird's'Promise.some()'](http://bluebirdjs.com/docs/api/promise.some.html)就是为此而设计的。它就像'Promise.all()',但是你传递了你想要等待的许多承诺。首先N到终点触发它(在哪里你决定N是什么)。 – jfriend00