首页 > 其他分享 >promise实现一个动态删减并持续执行的队列

promise实现一个动态删减并持续执行的队列

时间:2024-09-04 17:04:19浏览次数:5  
标签:resolve 队列 删减 queue 任务 promise isProcessing reject runNext

 

promiseQueue.js:

/*
 * @Author: Simoon.jia
 * @Date: 2024-09-04 16:00:24
 * @LastEditors: Simoon.jia
 * @LastEditTime: 2024-09-04 16:55:48
 * @Description: 描述
 */
export class PromiseQueue {
  constructor() {
    this.queue = [];
    this.isProcessing = false; // 标志当前是否有任务在执行
  }

  // 添加任务到队列
  add(task) {
    return new Promise((resolve, reject) => {
      this.queue.push({ task, resolve, reject });
      // console.log(this.queue, '执行队列');
      this.runNext(); // 尝试运行下一个任务
    });
  }

  // 运行下一个任务
  runNext() {
    if (this.isProcessing || this.queue.length === 0) {
      return;
    }
    this.isProcessing = true;
    const { task, resolve, reject } = this.queue.shift(); // 取出队首任务

    task()
      .then((result) => {
        this.isProcessing = false;
        resolve(result);
        this.runNext(); // 任务完成后运行下一个任务
      })
      .catch((error) => {
        this.isProcessing = false;
        reject(error);
        this.runNext(); // 处理失败后仍然运行下一个任务
      });
  }
}

调用:

 useEffect(() => {
    promiseQueue.current = new PromiseQueue();
  }, []);

//动态添加任务
 promiseQueue.current.add(() => new Promise((resolve, reject) => {
        switch (voiceBroadcast) {
          case '1':
            audio.play();
            audio.onended = () => {
              resolve();
            };

            break;
          case '2':
            window.speechSynthesis.speak(sound);
            sound.onend = () => {
              resolve();
            };
            break;

          default:
            audio.play();
            audio.onended = () => {
              window.speechSynthesis.speak(sound);
              sound.onend = () => {
                resolve();
              };
            };
            break;
          // 添加播放结束后的回调函数
          // audio.addEventListener('ended', onAudioEnded);
        }
      });
    );

 

样例:

class PromiseQueue {
    constructor() {
        this.queue = [];
        this.isProcessing = false; // 标志当前是否有任务在执行
    }

    // 添加任务到队列
    add(task) {
        return new Promise((resolve, reject) => {
            this.queue.push({ task, resolve, reject });
            this.runNext(); // 尝试运行下一个任务
        });
    }

    // 运行下一个任务
    runNext() {
        if (this.isProcessing || this.queue.length === 0) {
            return;
        }

        this.isProcessing = true;

        const { task, resolve, reject } = this.queue.shift(); // 取出队首任务

        task()
            .then((result) => {
                this.isProcessing = false;
                resolve(result);
                this.runNext(); // 任务完成后运行下一个任务
            })
            .catch((error) => {
                this.isProcessing = false;
                reject(error);
                this.runNext(); // 处理失败后仍然运行下一个任务
            });
    }
}

// 示例任务函数,返回一个Promise
const createTask = (taskName, duration) => () => {
    return new Promise((resolve) => {
        setTimeout(() => {
            console.log(`${taskName} completed`);
            resolve(taskName);
        }, duration);
    });
};

// 使用PromiseQueue
const queue = new PromiseQueue();

queue.add(createTask('Task 1', 1000));
queue.add(createTask('Task 2', 500));
queue.add(createTask('Task 3', 1500));

// 动态添加任务
setTimeout(() => {
    queue.add(createTask('Task 4', 1000));
}, 2000);

 

标签:resolve,队列,删减,queue,任务,promise,isProcessing,reject,runNext
From: https://www.cnblogs.com/Simoon/p/18396885

相关文章

  • 【大数据】Kafka与RocketMQ:消息队列界的“绝代双骄”
    文章目录一、开场白:消息队列江湖的“风云际会”二、正文1.Kafka与RocketMQ的由来:两颗璀璨的明星2.发展历程:各自的成长轨迹3.区别:各有千秋,各领风骚4.使用场景:谁的主场,谁的地盘?5.如何选择:挑花了眼怎么办?6.市场占用情况:谁更受欢迎?三、结尾:携手共创,消息队列的未来......
  • Lcode算法26:队列实现栈
    请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。实现 MyStack 类:voidpush(intx) 将元素x压入栈顶。intpop() 移除并返回栈顶元素。inttop() 返回栈顶元素。booleanempty() 如果栈是空的,返回 true ;否则,返回......
  • [Python手撕]用队列实现栈/用栈实现队列
    用队列实现栈classMyStack:def__init__(self):self.length=0self.queue1=[]self.queue2=[]defpush(self,x:int)->None:self.queue1.append(x)self.length+=1defpop(self)->int:......
  • CSP-J初赛知识点总复习( 3.3链式栈 3.4链式队列3.5链表习题)
    链式栈:(代码)#include<bits/stdc++.h>usingnamespacestd;//栈元素structStack{intdata;structStack*next;};Stack*top=NULL;//栈顶指针//入栈voidpush(intx){Stack*p=newStack;p->data=x;p->next=top;top=p;//修......
  • 进程间通信——消息队列(通俗易懂)
    消息队列概念消息队列是消息的链表,存放在内核中并由消息队列标识符标识,消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺陷。消息队列包括POSIX消息队列和SystemV消息队列。消息队列是UNIX下不同进程之间实现共享资源的一种机制,UNIX......
  • 进程间通信(信号灯集、消息队列)
    1.信号灯集线程:全局变量,同步通过信号量初始化:sem_init(&sem,0,0);申请资源:sem_wait(&sem);P操作,-1释放资源:sem_post(&sem);V操作,+11.1特点信号灯(semaphore),也叫信号量,信号灯集是一个信号灯的集合。它是不同进程间或一个给定进程内部不同线程间同步的机制;而Posi......
  • Nectar AI融资390万美元,打造无删减沉浸式AI伴侣
    NectarAI——一个沉浸式的AI陪伴平台,今日宣布已筹集390万美元的资金。本轮种子融资由MechanismCapital和Karatage共同领投,参与方包括Synergis、Maelstrom(ArthurHayes)、BuilderCapital、Baboon和Decima。知名天使投资人包括TekinSalimi和GeorgeLambeth(Dao5),以及AlbertCho......
  • 优先队列模板
    基础用法intmain(){ /* c++优先队列默认为大根堆 */ priority_queue<int,vector<int>>heap; heap.push(1); heap.push(2); heap.push(3); while(heap.size()){ cout<<heap.top()<<''; heap.pop(); } /*output:321*/ /* 优先队......
  • Spring中基于redis stream 的消息队列实现方法
       本文主要介绍了消息队列的概念性质和应用场景,介绍了kafka、rabbitMq常用消息队列中间件的应用模型及消息队列的实现方式,并实战了在Spring中基于redisstream的消息队列实现方法。一、消息队列   消息队列是一种进程间通信或者同一个进程中不同线程间的通信方......
  • [数据结构] 循环队列
    front:头指针rear:尾指针maxsize:数组长度循环队列通常会让留空数组中的一位,区分队列为空和队列为满的状态。入队移动rear,出队移动front。形式1(默认):front指向队头元素的前一位,而rear指向队尾元素。队列为空:front==rear队列为满:front==(rear+1)%maxsize元素个数:(r......