From 178fc763635fc6784a6c1cb00ee08012c7bd72fe Mon Sep 17 00:00:00 2001 From: pythongosssss <125205205+pythongosssss@users.noreply.github.com> Date: Sat, 1 Apr 2023 18:46:05 +0100 Subject: [PATCH] Added a queue for the queue action --- web/scripts/app.js | 63 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 44 insertions(+), 19 deletions(-) diff --git a/web/scripts/app.js b/web/scripts/app.js index 501c7ea..5af6d5f 100644 --- a/web/scripts/app.js +++ b/web/scripts/app.js @@ -5,6 +5,15 @@ import { defaultGraph } from "./defaultGraph.js"; import { getPngMetadata, importA1111 } from "./pnginfo.js"; class ComfyApp { + /** + * List of {number, batchCount} entries to queue + */ + #queueItems = []; + /** + * If the queue is currently being processed + */ + #processingQueue = false; + constructor() { this.ui = new ComfyUI(this); this.extensions = []; @@ -915,31 +924,47 @@ class ComfyApp { } async queuePrompt(number, batchCount = 1) { - for (let i = 0; i < batchCount; i++) { - const p = await this.graphToPrompt(); + this.#queueItems.push({ number, batchCount }); - try { - await api.queuePrompt(number, p); - } catch (error) { - this.ui.dialog.show(error.response || error.toString()); - return; - } + // Only have one action process the items so each one gets a unique seed correctly + if (this.#processingQueue) { + return; + } + + this.#processingQueue = true; + try { + while (this.#queueItems.length) { + ({ number, batchCount } = this.#queueItems.pop()); - for (const n of p.workflow.nodes) { - const node = graph.getNodeById(n.id); - if (node.widgets) { - for (const widget of node.widgets) { - // Allow widgets to run callbacks after a prompt has been queued - // e.g. random seed after every gen - if (widget.afterQueued) { - widget.afterQueued(); + for (let i = 0; i < batchCount; i++) { + const p = await this.graphToPrompt(); + + try { + await api.queuePrompt(number, p); + } catch (error) { + this.ui.dialog.show(error.response || error.toString()); + break; + } + + for (const n of p.workflow.nodes) { + const node = graph.getNodeById(n.id); + if (node.widgets) { + for (const widget of node.widgets) { + // Allow widgets to run callbacks after a prompt has been queued + // e.g. random seed after every gen + if (widget.afterQueued) { + widget.afterQueued(); + } + } } } + + this.canvas.draw(true, true); + await this.ui.queue.update(); } } - - this.canvas.draw(true, true); - await this.ui.queue.update(); + } finally { + this.#processingQueue = false; } }