• 【一篇就够】异步相关(一)


    1. promise 和 async await区别

    • 概念

            Promise 是异步编程的一种解决方案,比传统的解决方案--回调函数和事件--更合理更强大,简单地说,Promise好比容器,里面存在着一些未来才会执行完毕(异步)的事件和结果,而这些结果一旦生成是无法改变的。

            async await 也是异步编程的一种解决方案,他遵循的是Generator 函数的语法糖,他拥有内置执行器,不需要额外的调用直接会自动执行并输出结果,它返回的是一个Promise对象。

    • 两者的区别

    1. Promise的出现解决了传统callback函数导致的“地域回调”问题,但它的语法导致了它向纵向发展行成了一个回调链,遇到复杂的业务场景,这样的语法显然也是不美观的。而async await代码看起来会简洁些,使得异步代码看起来像同步代码,await的本质是可以提供等同于”同步效果“的等待异步返回能力的语法糖,只有这一句代码执行完,才会执行下一句。
    2. async await与Promise一样,是非阻塞的。
    3. async await是基于Promise实现的,可以说是改良版的Promise,它不能用于普通的回调函数。

    2. defer和async区别

            区别主要在于一个执行时间,defer会在文档解析完之后执行,并且多个defer会按照顺序执行,而async则是在js加载好之后就会执行,并且多个async,哪个加载好就执行哪个

    • 解析

            在没有defer或者async的情况下:会立即执行脚本,所以通常建议把script放在body最后

        

            async:有async的话,加载和渲染后续文档元素的过程将和 script.js 的加载与执行并行进行(异步)。
            但是多个js文件的加载顺序不会按照书写顺序进行

        

            derer:有derer的话,加载后续文档元素的过程将和 script.js 的加载并行进行(异步),但是 script.js 的执行要在所有元素解析完成之后,DOMContentLoaded 事件触发之前完成,并且多个defer会按照顺序进行加载。

        

    • 总结 

      • defer和async都是异步加载外部JS文件
      • defer和async的差别在于脚本下载完成之后何时执行,显然defer是更接近需求的
      • async不保证脚本的执行顺序
      • async在外部JS加载完毕之后,浏览器空闲时触发执行
      • defer是在外部JS加载完毕之后,整个文档解析完成后触发执行
      • defer更像是将