一、单线程和异步
单线程和异步的关系:因为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");
});