一、单线程和异步
单线程和异步的关系:因为js是单线程的原因,才出现了异步任务的概念。
1、js为什么是单线程:
(1)原始设计理念(出生原因): 最初只是用来减少网络请求,进行简单的表单验证,没有复杂的操作。
(2)不能允许多线程操作dom结构,在修改dom节点的时候删除节点。
2、为什么出现异步:
(1)遇到等待任务(网络请求,定时任务),不能让程序卡住。异步不会阻塞后边的代码执行
二、回调函数、回调地狱以及promise出现
异步任务会用到回调函数,多个有联系的异步任务会造成回调函数的嵌套,产生回调地狱,让人头晕眼花,还会给代码维护带来痛苦。
后来es6提供了新的异步解决方案,promise,通过链式调用解决了回调函数的嵌套,还提供了强大的api。
二、手写promise加载一张图片
function loadImg(url) {let p = new Promise((resolve, reject) => {let img = document.createElement("img");img.onload = () => {resolve(img);};img.onerror = () => {reject(new Error("图片加载失败:" + url));};img.src = url;});return p;}const url1 = "http://resource.muyiy.cn/image/20200720000433.png";const url2 = "http://resource.muyiy.cn/image/20200106214930.jpg";let imgPromise = loadImg(url1);imgPromise.then((val) => {console.log(val, "url1");return loadImg(url2);}).then((val) => {console.log(val, "url2");}).catch((error) => {console.log(error, "catch");});
