Es6 0316

84 阅读4分钟

Promise.resolve和Promise.reject

//Promise.resolve
      //是成功状态Promise 的一种简写模式状态

      // console.log(new Promise((resolve) => resolve("foo")));
      // 简写
      // Promise.resolve("foo");

      // 参数
      //一般参数
      // Promise.resolve().then((data) => console.log(data));

      // 当Promise.resolve()接收的是Promises 对象时,直接返回这个Promise对象什么都不做
      //   const p1 = new Promise((resolve) => {
      //     setTimeout(() => {
      //       resolve("wzxl");
      //     }, 1000);
      //   });
      //   Promise.resolve(p1).then((data) => {
      //     console.log(data);
      //   });

      // 等价于
      //   p1.then((data) => console.log(data));
      // 当resolve 函数接收的是Promise对象时,后面的then会根据传递的Promise 对象的状态变化决定执行那个一个回调

      // 具有then方法的对象

      // 2.Promise.reject()
      // 失败状态 Promise 的一种简写形式
      // console.log(new Promise((reject) => reject("foo")));
      // 简写
      // Promise.reject("foo");



Promise.all方法

// Promise.all()又什么用
      // Promise.all()关注多个Promise对象的状态
      // 传入多个Promise实例,包装成一个新的Promise实例放回

      //基本用法
      // Promise.all()的状态变化与所有传入的Promise实例对象状态有关
      //所有状态都变成 resolved 最终状态才会成resolved
      //只要有一个都变成 rejected 最终状态才会成rejected

      const delay = (ms) => {
        return new Promise((resolve) => {
          setInterval(() => {
            resolve();
          }, ms);
        });
      };

      const p1 = delay(1000).then(() => {
        console.log("p1 完成");
        return new Promise.reject();
      });
      const p2 = delay(2000).then(() => {
        console.log("p2 完成");
      });

      const p = Promise.all([p1, p2])
        .then(() => {
          console.log(123);
        })
        .catch(() => {
          console.log("失败");
        });


Promise.rece 和 Promise.allSettled

 const delay = (ms) => {
        return new Promise((resolve) => {
          setInterval(() => {
            resolve();
          }, ms);
        });
      };
      const p1 = delay(1000).then(() => {
        new Promise.reject();
        console.log("p1 完成");
      });
      const p2 = delay(2000).then(() => {
        console.log("p2 完成");
        return new Promise.reject();
      });

      // Promise.race() 的转态取决于第一个完成的Promise实例对象,
      // 如果第一个完成的成功了,那最终的就成功,如果第一个完成的失败了
      // 那最终就失败了

      const recePromise = Promise.race([p1, p2])
        .then((data) => {
          console.log(data);
        })
        .catch(() => {
          console.log("失败");
        });

      //2. Promise.allSettled()
      // Promise.allSettled() 的状态与传入的Promise 状态无关
      // 永远都是成功
      // 他只会忠实的记录下各个 Promise 的表现
      //   const recePromise = Promise.allSettled([p1, p2]).then((data) => {
      //     console.log(data);
      //   });


Promise的注意事项

//1. resolve 或 reject 函数执行后的代码
      // 推荐在调用 resolve 或reject 函数的时候加上return 不再执行他们后面的代码

      //   const p = new Promise((resolve, reject) => {
      //     return resolve("成功");
      //   });

      //   p.then((data) => {
      //     console.log(data);
      //   });

      //2. Promise.all/race/allSettled的参数问题
      // 参数如果不是 Promise 数组,会将不是Promise 的数组元素变成 Promise
      //   Promise.all([1, 2, 3]).then((data) => {
      //     console.log(data);
      //   });
      // 等价于
      //   Promise.all(() => {
      //     Promise.resolve(1);
      //     Promise.resolve(2);
      //     Promise.resolve(3);
      //   }).then((data) => {
      //     console.log(data);
      //   });
      // 不只是数组,任何可遍历的都可作为参数
      // 数组 字符串 Set Map NodeList arguments

      //3. Promise.all/race/allSettled的错误处理
      const delay = (ms) => {
        return new Promise((resolve) => {
          setInterval(() => {
            resolve();
          }, ms);
        });
      };

      const p1 = delay(1000).then(() => {
        console.log("p1 完成");
        return new Promise.reject();
      });
      const p2 = delay(2000).then(() => {
        console.log("p2 完成");
      });

      Promise.all([p1, p2])
        .then((data) => {
          console.log(data);
        })
        .catch(() => {
          console.log("err");
        });

Promise的应用

  • 异步图片加载
// 异步加载图片
      const loadimgAsync = (url) => {
        return new Promise((resolve, reject) => {
          const aImg = new Image();
          aImg.src = url;

          aImg.onload = () => {
            resolve(aImg);
          };
          aImg.onerror = () => {
            reject("图片加载失败");
          };
        });
      };
      const img1 = document.getElementById("img1");
      loadimgAsync(
        "https://pics1.baidu.com/feed/d6ca7bcb0a46f21fd0eb58633196b76b0d33ae65.jpeg@f_auto?token=347358c07b35aad03724daaf9b75c479"
      ).then((image) => {
        setTimeout(() => {
          img1.src = image.src;
        }, 2000);
      });

class是什么

cript>
      //1. 认识Class
      // 类可以可能做是对象的模板,用一个类可以创建出许多不同的对象

      //2.Class的基本用法
      // 类名一般首字母大写

      //   class Person {
      //     // 实例化时执行构造方法,所以必须有构造方法,但可以不写出来
      //     constructor(name, age) {
      //       this.name = name;
      //       this.age = age;
      //       // 一般构造方法中定义属性,方法不在构造方法中定义
      //     }
      //     speak() {}
      //   }
      // 3.class 与构造函数
      class Person {
        // 实例化时执行构造方法,所以必须有构造方法,但可以不写出来
        constructor(name, age) {
          this.name = name;
          this.age = age;
          // 一般构造方法中定义属性,方法不在构造方法中定义
        }
        speak() {}
      }

class 的两种形式

      // 1. 声明形式
      //   class Person {
      //     constructor() {}
      //   }

      //2.表达式形式

      //   const Person = class {
      //     constructor() {
      //       console.log(1);
      //     }
      //   };
      //   new Person();

      new (class {
        constructor() {
          console.log(11);
        }
      })();

将时间戳化为天数

 function getTime(s) {
        let day = Math.floor(s / (3600 * 24 * 1000));
        s %= 3600 * 1000 * 24;
        let hours = Math.floor(s / (3600 * 1000));
        s %= 3600 * 1000;
        let f = Math.floor(s / (60 * 1000));
        let m = Math.floor((s % (1000 * 60)) / 1000);
        console.log(day, hours, f, m);
        let daet = `${day}天:${hours}小时${f}分钟${m}秒`;
        document.body.innerHTML = daet;
      }

      getTime(new Date().getTime());

      setInterval(() => {
        getTime(new Date().getTime());
      }, 1000);


Moudule的两种导出和导入

// 1.认识导出和导入
      // 导入的东西可以被导入(import) 病房问到
      // 一个模块没有导出也可以导入
      // 被导入的代码都会执行一遍,也近会执行一遍
      //   import "./dombl.js";
      //2.基本用法
      // 可以随便起名
      // import seintw from "./dom.js";

      // 一个模块只有一个expot default
      // expot default sex
      // Promise.reject()
      //   .then(() => {
      //     console.log(1);
      //   })
      //   .catch(() => {
      //     console.log(2);
      //     throw new Error();
      //   })
      //   .then(() => {
      //     console.log(3);
      //   })
      //   .catch(() => {
      //     console.log(4);
      //   });
      console.log("start");
      setTimeout(() => {
        console.log("settimeout");
      }, 0);
      Promise.resolve().then(() => {
        console.log("promise");
        throw new Error();
      });
      setInterval(() => {
        console.log("setinterval");
      }, 500);
      console.log("end");