美文网首页
promise任务队列串行化执行

promise任务队列串行化执行

作者: qiuxiaojie | 来源:发表于2019-05-25 15:30 被阅读0次

js经常会遇到异步的执行,简单的异步执行可以使用回调,多个异步回调执行可以使用await/async解决。遇到多个不定的异步需要同步一个一个执行的时候,无法直接执行,例如多个网络请求,需要一个一个去执行,就会遇到任务队列串行执行的问题。
在遇到多个需要异步执行的promise时,可以直接使用promise提供了all方法同时执行多个promise,但是并未能解决异步的任务是不断产生的情况。在异步任务不断产生而且需要顺序的执行完一个才能执行下一个的情况下。使用定时器和队列来解决,新任务加入队列,队列不断拿出任务执行,就可以做到串行化执行了。

export interface PromiseQueueOptions {
  interval?: number;
}

export default class PromiseQueue {
  private interval?: any;
  // 选项
  private options: PromiseQueueOptions;
  // 锁定
  private lock = false;
  // 队列
  private queue: (() => Promise<any>)[] = [];
  static instance(options: PromiseQueueOptions = {}): PromiseQueue {
    if (options.interval == undefined) options.interval = 200;
    return new PromiseQueue(options);
  }
  constructor(options: PromiseQueueOptions) {
    this.options = options;
    this.interval = setInterval(async () => {
      // 没有任务或者任务执行中情况不执行
      if (this.queue.length > 0 && !this.lock) {
        console.log('execute queue');
        // 锁定
        this.lock = true;
        // 取出函数
        const f = this.queue.shift();
        // 解锁
        await f!();
        this.lock = false;
      }
    }, options.interval);
  }
  // 加入队列
  push(f: () => Promise<any>) {
    this.queue.push(f);
  }
  // 释放队列
  destory() {
    clearInterval(this.interval);
  }
}

相关文章

  • promise任务队列串行化执行

    js经常会遇到异步的执行,简单的异步执行可以使用回调,多个异步回调执行可以使用await/async解决。遇到多个...

  • promise ES6 一看就懂

    Promise 我们都知道JavaScript是单线程执行的,执行的顺序是按照任务队列来执行的。 什么是任务队列?...

  • setTimeout、Promise、Async/Await 的

    setTimeout setTimeout回调函数放在宏任务队列里,等到执行栈清空后执行 Promise 本身是同...

  • 一步步手写Promise 2

    then的基础构建 对比原生Promise会发现MyPromise是同步执行的 将任务放到任务队列中

  • 理解Promise的执行顺序

    优先执行Promise实例化函数中的内容 then中的函数被加入微任务队列 执行到resolve后,当前上下文执行...

  • Promise结合reduce构建顺序执行队列

    Promise结合reduce构建顺序执行队列

  • nextTick、setImmediate、promise.re

    执行队列(同步) 任务队列(异步事件) 每当异步任务完成后会在任务队列中添加一个关联事件,待执行队列任务执行完成...

  • iOS 多线程之GCD

    GCD核心概念 任务 :执行的操作 队列 :执行任务的等待队列 任务 同步执行 :同步添加任务到指定的队列中,如果...

  • GCD小总结

    单例模式 串行队列同步/异步执行任务 并发队列同步/异步执行任务 队列组 延时执行 barrier

  • 2018-06-08 宏任务和微任务

    js先把宏任务放进宏任务队列里,再把微任务放进微任务队列里,执行的时候先执行宏任务队列里的一个任务,再把微任务队列...

网友评论

      本文标题:promise任务队列串行化执行

      本文链接:https://www.haomeiwen.com/subject/rxfzzqtx.html