前端

71 阅读2分钟

手写promise/image对象

  1. new image()-----声明一个image对象
  2. onload-----当图片加载成功时执行
  3. onerror----当图片加载失败时执行
  4. .src----设置图片路径 作用:解决回调地狱问题 语法:new Promise
// new Image()创建的是img对象,类似于使用document.getElementxxx获取到的DOM对象。
    const oImg = new Image();
    // 相当于src
    oImg.src = "https://www.itcast.cn/files/image/201904/20190415093116732.png";
    oImg.onload=()=>{ //图片加载完成之后插入
        document.body.appendChild(oImg);
    }
    oImg.onerror = function(){
        console.log("error");
    }
// 练习promise
    // 请求成功的时候触发resolve,请求失败的时候触发reject
    const oP = new Promise((resolve,reject)=>{
        setTimeout(()=>{
            // resolve();
            reject()
        },1000)
    });
    oP.then(()=>{
        console.log('then');
    }).catch(()=>{
        console.log("catch");
    })
// (1) promise加载图片  创建一个promise实例
    const oP = new Promise((resolve,reject)=>{
        // new Image()创建的是img对象,类似于使用document.getElementxxx获取到的DOM对象。
        const oImg = new Image();
        // 类似于img标签中的src
        oImg.src = "https://www.itcast.cn/files/image/201904/20190415093116732.png";
        // 执行的时候
        oImg.onload = () => {
            resolve(oImg);
        }
        // 图片加载失败的时候
        oImg.onerror = () => {
            reject("图片加载失败");
        }
    });
    // 当图片执行的时候在页面插入图片
    oP.then((oImg)=>{
        document.body.appendChild(oImg)
    }).catch((errMsg)=>{  // 不执行的时候
        console.log(errMsg);
    })
// (2) loadImg
    function loadImg(src){
        return new Promise((resolve,reject)=>{
        const oImg = new Image();
        oImg.src = src;
        oImg.onload = () => {
            resolve(oImg);
        }
        oImg.onerror = () => {
            reject("图片加载失败");
        }
    });
    }
    // 自动加载图片
    loadImg('https://www.itcast.cn/files/image/201904/20190415093116732.png')
    .then((oImg)=>{
        document.body.appendChild(oImg);
        // 第二张图片
        return loadImg('https://5b0988e595225.cdn.sohucs.com/images/20171031/9e0306ba3e1d4774bc88e14b2534f1db.png')
    }).then((oImg)=>{
        document.body.appendChild(oImg)
    })
    .catch((errMsg)=>{  // 不执行的时候
        console.log(errMsg);
    })
// (3)
    function loadImg(src){
        return new Promise((resolve,reject)=>{
        const oImg = new Image();
        oImg.src = src;
        oImg.onload = () => {
            resolve(oImg);
        }
        oImg.onerror = () => {
            reject("图片加载失败");
        }
    });
    }
    (async function(){
        try {
            const oImg = await loadImg("https://www.itcast.cn/files/image/201904/20190415093116732.png")
            document.body.appendChild(oImg);
        }catch(err){
            console.log(err);
        }
    })();

Promise 阅读代码题

  • js执行顺序:自上而下,先同步再异步、先微任务后宏任务
  • new Promise()-->Promise.resolve();
  • then和catch内部没有throw new Error相当于resolve
  • async function 相当于返回Promise.resolve()
  • await 后面的代码都是异步的
1) then 和 catch 内部没有 throw new Error 相当于 resolve
    Promise.resolve()
    .then(()=>{
        console.log(1);
    })
    .catch(()=>{
        console.log(2);
    })
    .then(()=>{
        console.log(3);
    })

async

// 考点2  async function 相当于返回一个promise.resolve
    async function fn(){
        return 100;
    }
    (async function(){
        const a = fn();
        const b = await fn();
        console.log(a);
        console.log(b);
    })();

综合

async function fn1(){
        console.log("fn1 start");
        await fn2();
        console.log("fn1 end");
    }
    async function fn2(){
        console.log("fn2");
    }
    console.log("start");
    setTimeout(()=>{
        console.log("setTimeout");
    })
    fn1();
    console.log("end");

for in 和 for of 的区别

  • for in 遍历得到的key:可枚举的数据-->数组、字符串、对象
  • for of 遍历得到的value:可迭代的数据-->数组、字符串、set、Map
  • 检验是否可枚举:Object.getOwnPropertyDescriptors(obj)->enumerable:true
  • 检验是否可迭代:arrSymbol.iterator->next()
// 数组
    const arr = [10,20,30];
    for(let val of arr) {
        console.log(val);
    }
// 对象
    const obj = {
        name:"abc",
        age:18
    }
    for(let val of obj) {
        console.log(val);
    }
// set map
    const set = new Set([10,20,30]);
    for(let val in set){
        console.log(val);
    }
    const map = new Map([
        ["a",18],
        ["b",18],
        ["c",18],
    ])
    for(let val in map){
        console.log(val);
    }

for await...of

    简单写法
    function getPromise(num){
        return new Promise((resolve,reject)=>{
            setTimeout(()=>{
                resolve(num);
            },1000)
        })
    }
    const p1 = getPromise(10);
    const p2 = getPromise(20);
    const p3 = getPromise(30);
    const list = [p1,p2,p3];
    (async function(){
        const data = [10,20,30];
        for(let val of data){
            const res = await getPromise(val);
            console.log(res);
        }
    })()
  • for await..of:输出单独的每一个结果
    (async function(){
        for await(let res of list){
            console.log(res);
        }
    })()
  • Promise.all:输出一组结果
    Promise.all(list).then((res)=>{
        console.log(res);
    })