• promise A+ 规范 第三遍


    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>promise A+规范 第三遍</title>
      </head>
      <body>
        <script>
          let a = `1:每个异步操作都被看做一个任务,每个任务都分为两个阶段和三个状态,分别是 unsettled 未决阶段 settled 已决阶段,pending 等待态 fulfilled 成功态
                      rejected 失败态;
                   2:任务的各个状态不可逆转,只能由 pending 转为 fulfilled 或 rejected
                   3:由 unsettled 未决阶段转为 settled 已决阶段中,由pending 转化为 fulfilled 的行为称之为 resolve,转化为 rejected 的行为称之为 reject
                   4:任务都会提供一个then方法,它有两个参数,分别是onFulfilled 和 onRejected`;
          const PENDING = 'pending';
          const FULFILLED = 'fulfilled';
          const REJECTED = 'rejected';
          class myPromise {
            constructor(executor) {
              this.status = PENDING;
              this.data = null;
              this.reason = null;
              this.dispatchers = [];
              try {
                executor(this.__resolve.bind(this), this.__reject.bind(this));
              } catch (err) {
                this.__reject(err);
              }
            }
            __resolve(data) {
              if (this.status !== PENDING) return;
              this.status = FULFILLED;
              this.data = data;
              this.__dispatchers();
            }
            __reject(reason) {
              if (this.status !== PENDING) return;
              this.status = REJECTED;
              this.reason = reason;
              this.__dispatchers();
            }
            __dispatchers() {
              if (this.status === PENDING) return;
              for (const dispatcherConf of this.dispatchers) {
                this.__dispatcher(dispatcherConf);
              }
            }
            __dispatcher({ status, dispatcher, resolve, reject }) {
              if (this.status !== status) return;
              if (typeof dispatcher !== 'function') {
                this.status === FULFILLED ? resolve(this.data) : reject(this.data);
                return;
              }
              try {
                const result = dispatcher(this.status === FULFILLED ? this.data : this.reason);
                resolve(result);
              } catch (err) {
                reject(err);
              }
            }
            then(onFulfiled, onRejected) {
              return new myPromise((resolve, reject) => {
                this.dispatchers.push(
                  {
                    status: FULFILLED,
                    dispatcher: onFulfiled,
                    resolve,
                    reject
                  },
                  {
                    status: REJECTED,
                    dispatcher: onRejected,
                    resolve,
                    reject
                  }
                );
                this.__dispatchers();
              });
            }
            catch(onRejected) {
              return this.then(null, onRejected);
            }
          }
    
          const pro = new myPromise((resolve, reject) => {
            setTimeout(function () {
              resolve(123);
            }, 1000);
          });
          pro.then(r => {
            console.log(r);
          });
        </script>
      </body>
    </html>
  • 相关阅读:
    关于用户、用户组及文件权限的试题
    lvm-简介
    项目中用到的jar包简介(1)
    Centos7开启SSH服务
    2.docker架构,原理,安装及简单应用
    如何平滑将注册中心从Eureka迁移到Nacos?
    8.k8s连载--重新生成k8s token(kubeadm join报错及解决)
    7. 复制k8s Node节点 并重新初始化k8s-nodes2节点 (k8s连载)
    6. k8s + jenkins 实现持续集成(完)
    5.k8s基本命令汇总
  • 原文地址:https://www.cnblogs.com/pengxiangchong/p/16229881.html
Copyright © 2020-2023  润新知