我正在寻找一个promise函数 Package 器,它可以在给定的promise运行时进行限制/节流,以便在给定的时间只有一组数量的promise运行。
在下面的情况下,delayPromise
不应该并发运行,它们应该按照先到先得的顺序一次运行一个。
import Promise from 'bluebird'
function _delayPromise (seconds, str) {
console.log(str)
return Promise.delay(seconds)
}
let delayPromise = limitConcurrency(_delayPromise, 1)
async function a() {
await delayPromise(100, "a:a")
await delayPromise(100, "a:b")
await delayPromise(100, "a:c")
}
async function b() {
await delayPromise(100, "b:a")
await delayPromise(100, "b:b")
await delayPromise(100, "b:c")
}
a().then(() => console.log('done'))
b().then(() => console.log('done'))
有什么办法能让这样的队伍排起来吗?
我有一个来自Benjamin Gruenbaum
的“debounce”函数,我需要修改这个函数,根据它自己的执行而不是延迟来限制一个承诺。
export function promiseDebounce (fn, delay, count) {
let working = 0
let queue = []
function work () {
if ((queue.length === 0) || (working === count)) return
working++
Promise.delay(delay).tap(function () { working-- }).then(work)
var next = queue.shift()
next[2](fn.apply(next[0], next[1]))
}
return function debounced () {
var args = arguments
return new Promise(function (resolve) {
queue.push([this, args, resolve])
if (working < count) work()
}.bind(this))
}
}
5条答案
按热度按时间z6psavjg1#
我不认为有任何库可以做到这一点,但实际上您自己实现起来相当简单:
对于多个并发请求,这会变得有点棘手,但也可以做到。
顺便说一句,你可能想看看actors model和CSP。它们可以简化处理这类事情,也有一些JS库适合它们。
vptzau2j2#
使用限制承诺模块:
https://www.npmjs.com/package/throttled-promise
nom7f22z3#
我也有同样的问题,我写了一个库来实现它,代码是here,我创建了一个队列来保存所有的承诺,当你把一些承诺推送到队列中时,队列头的前几个承诺会弹出并运行,一旦一个承诺完成,队列中的下一个承诺也会弹出并运行,一次又一次,直到队列中没有
Task
为止。详细信息可以查看代码。希望这个库对您有所帮助。rseugnpd4#
优点
第一件事是让https成为一个承诺,所以我们可以使用wait来检索数据(从示例中删除)第二件事是创建一个承诺调度程序,在任何承诺得到解决时提交另一个请求。
通过限制并发承诺的数量来限制接受的请求
6gpjuf905#
串行运行异步进程的经典方法是使用
async.js
和async.series()
,如果您更喜欢基于promise的代码,那么有一个promise版本的async.js
:async-q对于
async-q
,您可以再次使用series
:同时运行其中两个将同时运行
a
和b
,但在每个内部它们将是顺序的:如果您想在
a
之后运行b
,请将其放入.then()
:如果您不想按顺序运行每个进程,而是想限制每个进程同时运行一定数量的进程,则可以使用
parallelLimit()
:阅读async-q文档:https://github.com/dbushong/async-q/blob/master/READJSME.md