我该怎么做$q.all
但限制同时执行的承诺数量?
我的问题就像如何限制 Q Promise 并发数? https://stackoverflow.com/q/20546373/135114
我希望一次生成的进程不超过 5 个
另一个问题的公认答案是一个为promise https://github.com/then/promise包装以配合使用Q https://github.com/kriskowal/q。
但我对 Angular 的解决方案特别感兴趣$q
而不是为了Q
.
Background: The problem being solved:
I have a bunch of files to download in 2 steps: a) Get URL b) download file.
The browser limits how many files can be retrieved concurrently, so when the straightforward use of promises with $q.all
fires off all the downloads, only N happen right away, e.g. 6 in Chrome, while the rest are delayed. (see Max parallel http connections in a browser? https://stackoverflow.com/q/985431/135114)
Problem is that the URLs have expiry, so by the time the browser executes the N+1th file download, the URL is no longer valid.
So I want to do something like throttled.all(6, promises)
rather than $q.all(promise)
如果“所有”Promise 的解析是无关紧要的(就像您正在更新页面上的某些元素,并且您不关心它是否是渐进的而不是一次性的),我创建了一个简单的任务队列服务。它不会等待所有承诺都得到解决,而是会处理它获得的所有添加的承诺/功能/任务,并且最多处理。配置的限制值的并发数。
因为我只发现这个和其他一些 StackOverflow 对我的问题没有帮助。所以我想我现在会回馈社区一些东西。希望它对某人有帮助。
它使用现代 JS 的东西,如 const 和 lambda 表达式,但如果你只想要“旧”的东西,你可以简单地让它从像 babel 之类的预编译器编译下来。
https://gist.github.com/Blackskyliner/8b1bafed326044fa4f8b1ba2627d1117 https://gist.github.com/Blackskyliner/8b1bafed326044fa4f8b1ba2627d1117
它只是在添加任务后简单地处理其队列,任务只是返回承诺或值的匿名函数。它将遵循服务上的可配置“maxConcurrentTasks”变量。
如果任务返回一个承诺,该承诺又返回一个承诺等,它将始终使用队列中的初始“槽”。因此,在整个任务承诺链得到解决(或拒绝)后,它将为其他添加的任务释放“槽”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)