zoukankan      html  css  js  c++  java
  • 异步

    1.单线程和异步

      js本身是单线程语言,只能同时做一件事

      浏览器和nodejs已支持JS启动进程,如web Worker

      JS和DOM渲染共享同一个线程,因为JS可以修改DOM结构

    2.我们都知道js是单线程

    单线程---->只有一个线程,同时只能做一件事,两段js不能同时执行

    原因:避免DOM渲染冲突

       我们知道js可以修改DOM结构, js执行的时候,浏览器DOM渲染会暂停

    两段js也不能同时执行,不然渲染DOM有冲突

       webworker支持多线程,但是不能访问DOM

    引出问题:我们不能遇到setTimeout就等着吧 

    解决方案就是:异步

     event-loop:事件轮询,是js实现异步的具体解决方案

                同步代码,直接执行

                异步函数放在异步队列中

                待同步函数执行完毕,轮询执行异步队列中的函数  

    异步引出问题:执行方式顺序问题

           callback不容易模块化,异步代码回调地狱链,代码逻辑堆砌

    解决方案:promise

    function loadImg(src) {
                var promise = new Promise(function (resolve, reject) {
                    var img = document.createElement('img')
                    img.onload = function () {
                        resolve(img)
                    }
                    img.onerror = function () {
                        reject('图片加载失败')
                    }
                    img.src = src
                })
                return promise
            }
    
            var src = 'https://www.imooc.com/static/img/index/logo_new.png'
            var result = loadImg(src)
            result.then(function (img) {
                console.log(1, img.width)
                return img //这里要返回img,下一个then才能使用
            }, function () {
                console.log('error 1')
            }).then(function (img) {
                console.log(2, img.height)
            })
    
            var src = 'https://www.imooc.com/static/img/index/logo_new.png'
            var result = loadImg(src)
            result.then(function (img) {
                console.log(1, img.width)
                return img
            }).then(function (img) {
                console.log(2, img.height)
            }).catch(function (ex) {
                // 统一捕获异常
                console.log(ex)
            })
         
    //顺序加载两个图片需求
    var src1 = 'https://www.imooc.com/static/img/index/logo_new.png' var result1 = loadImg(src1) var src2 = 'https://img1.mukewang.com/545862fe00017c2602200220-100-100.jpg' var result2 = loadImg(src2) result1.then(function (img1) { console.log('第一个图片加载完成', img1.width) return result2 // 重要!!! }).then(function (img2) { console.log('第二个图片加载完成', img2.width) }).catch(function (ex) { console.log(ex) }) var src1 = 'https://www.imooc.com/static/img/index/logo_new.png' var result1 = loadImg(src1) var src2 = 'https://img1.mukewang.com/545862fe00017c2602200220-100-100.jpg' var result2 = loadImg(src2) Promise.all([result1, result2]).then(function (datas) { console.log('all', datas[0]) console.log('all', datas[1]) }) Promise.race([result1, result2]).then(function (data) { console.log('race', data) })

            async/await ====> then只是把callback拆分了,async/await直接是同步的写法,没有任何回调

  • 相关阅读:
    wpf写的httpget请求
    c#的反射机制
    C#中所有的类都继承自哪个类
    使用c#创建windows的桌面的自启服务
    工厂模式的三种实现,就这么简单!
    Github上的沙雕项目,玩100遍都不够
    代理模式的种类、原理及各种实例详解
    面试官问:HashMap在并发情况下为什么造成死循环?一脸懵
    Oracle中 COUNT(count(*))语法
    jquery如何获取当前时间
  • 原文地址:https://www.cnblogs.com/zhuMother/p/13256459.html
Copyright © 2011-2022 走看看