Javascript基础知识体系化学习总结(四)异步

219 阅读2分钟

这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

一、单线程

1.javascript是单线程语言,只能同时做一件事,代码从上往下执行,一个个加载。

2.javascript和DOM渲染共用一个浏览器线程,即两者只能同时进行一个,这是为了保证不会出现两者同时对一个元素做操作。

3.浏览器和node.js已经支持javascript启动进程,例如WebWorker。

二、callback

1.callback即是回调函数,是来处理异步的,至于为什么会出现异步的情况,是因为js单线程很可能导致我们加载某些内容的时候等待时间过长卡住。

2.callback本身不足,很容易引起回调地狱,不仅阅读困难,也很难去维护这些代码。

三、应用场景

1.同步和异步的区别:同步会阻塞代码的执行,异步不会阻塞代码的执行。

2.发送网络请求的时候例如请求一些资源(图片等等)。

3.出现定时任务的时候如setTimeout和setInterval。

四、Promise

1.为了解决使用callback产生的回调地狱,promise采用了并行的书写方式,区别于callback的嵌套方式。

2.关于具体如何使用promise,我们给出一个手写promise加载图片的函数熟悉一下:

	function loadImage(src) { // 定义promise加载图片的方法
		const p = new Promise((resolve, reject)=>{ // 将整个promise赋值给一个变量,方便后面直接返回变量
			const img = document.createElement('img')
			img.src = src // 在DOM创建一个img标签并且指定图片地址为我们的传入的地址
			img.onload=()=>{
				resolve(img)
			} // 图片成功加载则触发resolve状态,并且返回img标签(带地址),调用者用.then接收
			img.onError=()=>{
				const err = `图片加载失败${src}`
				reject(err)
			} // 图片加载失败则触发reject,并且把错误信息传回去,调用者用.catch接收
		})
		return p // 返回变量
	}
	const url1 = 'https://www.3dmgame.com/uploads/images/thumbztfirst/20180824/1535097139_983975.jpg'
	const url2 = 'https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=3719520752,2657134858&fm=26&gp=0.jpg'
	loadImage(url1) // 调用我们定义的方法
	.then((img)=>{
		console.log(img.width);
		return img // 成功加载第一张图片时打印其宽并且返回img标签,方便下一个then使用
	})
	.then((img)=>{
		console.log(img.width);
		return loadImage(url2) // 这里调用我们定义的方法,准备加载第二张图片
	})
	.then((img)=>{
		console.log(img.width);
		return img
	})
	.then((img)=>{
		console.log(img.height);
	})
	.catch((err)=>{
		console.log(err);
	})