zoukankan      html  css  js  c++  java
  • promise-abortable

    /**
     * Abortable Promise
     *
     * @author dondevi
     * @create 2019-05-27
     */
    
    import getAbortController from "./controller.js";
    
    export default class AbortablePromise extends Promise {
    
      constructor (executor, abortController = getAbortController()) {
        super((resolve, reject) => {
          executor(resolve, reject, abortController.signal);
        });
        this.abortController = abortController;
      }
    
      then (onFulfilled, onRejected) {
        return new AbortablePromise((resolve, reject, signal) => {
          const onSettled = (status, value, callback) => {
            if ("function" === typeof callback) {
              value = callback(value);
              if (value instanceof AbortablePromise) {
                Object.assign(signal, value.abortController.signal);
              }
              return resolve(value);
            }
            "resolved" === status && resolve(value);
            "rejected" === status && reject(value);
          }
          super.then(
            value => onSettled("resolved", value, onFulfilled),
            reason => onSettled("rejected", reason, onRejected)
          );
        }, this.abortController);
      }
    
      // Equivalent to this.then(undefined, onRejected)
      // catch (onRejected) {}
    
      abort (reason) {
        return new AbortablePromise((resolve, reject) => {
          Promise.resolve().then(() => {
            this.abortController.abort(reason);
            this.then(resolve, reject);
          });
        }, this.abortController);
      }
    
      static all (promises) {
        return new AbortablePromise((resolve, reject, signal) => {
          setPromisesAbort(promises, signal);
          Promise.all(promises).then(resolve, reject);
        });
      }
    
      static race (promises) {
        return new AbortablePromise((resolve, reject, signal) => {
          setPromisesAbort(promises, signal);
          Promise.race(promises).then(resolve, reject);
        });
      }
    
    };
    
    /**
     * Set promises abort
     * @param {Array} promises - list of promise
     * @param {Object} signal - abort signal
     */
    function setPromisesAbort (promises, signal) {
      signal.onabort = reason => {
        promises.forEach((promise) => {
          if (promise instanceof AbortablePromise) {
            promise.abort(reason).catch(error => error);
          }
        });
      }
    }
  • 相关阅读:
    数据结构与算法(3-4)--矩阵的压缩存储
    数据结构与算法(3-3)--队列的应用
    数据结构与算法(3-2)--栈的应用
    数据结构与算法(3-1)--栈和队列
    数据结构与算法(2)--线性表(数组和链表)
    数据结构与算法(1)--时间及空间复杂度
    python变量与地址的关系
    python高级(03)--socket编程
    python高级(02)--生成器和迭代器
    python处理http接口请求
  • 原文地址:https://www.cnblogs.com/porter/p/13372702.html
Copyright © 2011-2022 走看看