Ich bin auf der Suche nach einem Versprechen Funktion Wrapper, die begrenzen/Drosselung, wenn eine gegebene Versprechen ausgeführt wird, so dass nur eine bestimmte Anzahl der Versprechen zu einem bestimmten Zeitpunkt ausgeführt wird.Limit Concurrency des Versprechens ausgeführt
In dem folgenden Fall sollte delayPromise
nie gleichzeitig ausgeführt werden, sie sollten alle nacheinander in der Reihenfolge "Wer zuerst kommt, mahlt zuerst" ausgeführt werden.
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'))
Irgendwelche Ideen, wie man eine Warteschlange wie diese einrichten?
Ich habe eine "Entprellen" -Funktion von der wunderbaren Benjamin Gruenbaum
. Ich muss dies ändern, um ein Versprechen zu drosseln, das auf seiner eigenen Ausführung und nicht auf der Verzögerung basiert.
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))
}
}
async.js und queue.js unterstützen beide konfigurierbare Parallelität. – nrabinowitz
Für Arrays oder die Verwaltung des Zustands einer bestimmten Funktion und ihrer Instanzen? – ThomasReggi
@rabinowitz beide dieser Bibliotheken haben nichts mit Versprechungen zu tun. – ThomasReggi