在TypeScript中,我创建了大约100个Promise
个实例,这些实例都可能被解析或拒绝。但我只需等待其中5个已解决,其余部分必须取消(如果可能),因为它们不再需要工作。如果取消是不可能的,拒绝其余的也没关系。
如何做到这一点?
答案 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函数的结构有点奇怪。使用异步代码时,我更喜欢只有一个修改共享状态的代码路径。