一、单线程和异步
    单线程和异步的关系:因为js是单线程的原因,才出现了异步任务的概念。
    1、js为什么是单线程
    (1)原始设计理念(出生原因): 最初只是用来减少网络请求,进行简单的表单验证,没有复杂的操作。
    (2)不能允许多线程操作dom结构,在修改dom节点的时候删除节点。
    2、为什么出现异步
    (1)遇到等待任务(网络请求,定时任务),不能让程序卡住。异步不会阻塞后边的代码执行
    二、回调函数、回调地狱以及promise出现
    异步任务会用到回调函数,多个有联系的异步任务会造成回调函数的嵌套,产生回调地狱,让人头晕眼花,还会给代码维护带来痛苦。
    后来es6提供了新的异步解决方案,promise,通过链式调用解决了回调函数的嵌套,还提供了强大的api。
    二、手写promise加载一张图片

    1. function loadImg(url) {
    2. let p = new Promise((resolve, reject) => {
    3. let img = document.createElement("img");
    4. img.onload = () => {
    5. resolve(img);
    6. };
    7. img.onerror = () => {
    8. reject(new Error("图片加载失败:" + url));
    9. };
    10. img.src = url;
    11. });
    12. return p;
    13. }
    14. const url1 = "http://resource.muyiy.cn/image/20200720000433.png";
    15. const url2 = "http://resource.muyiy.cn/image/20200106214930.jpg";
    16. let imgPromise = loadImg(url1);
    17. imgPromise
    18. .then((val) => {
    19. console.log(val, "url1");
    20. return loadImg(url2);
    21. })
    22. .then((val) => {
    23. console.log(val, "url2");
    24. })
    25. .catch((error) => {
    26. console.log(error, "catch");
    27. });