60-61:JS中的事件队列和事件循环机制(宏任务和微任务)

JS本身是单线程的(浏览器只分配一个线程供JS代码自上而下运行)
=>在JS中大部分操作都是同步编程:当前任务不完成,下一个任务是无法继续执行的,换句话说,任务是逐一执行的
=>但是对于某些特殊的需求,也是需要按照异步编程的思维去处理的

[浏览器端]

  • 定时器是异步编程
  • JS中的事件绑定是异步编程
  • Ajax/Fetch请求的发送(HTTP事务)
  • Promise设计模式管控异步编程的(包括:async/await…)

[Node端]

  • progress.nextTick
  • setImmediate
  • FS进行I/O操作可以是异步操作
    * …
    *
  • JS中异步操作的运行机制:事件队列 Event Queue 和 事件循环 Event Loop
    请添加图片描述
let n = 0;
// 设置定时器的操作是同步的,但是1S干的事情是异步的
	setTimeout(_ => {
			n += 10;
			console.log(n);
		}, 1000);
		n += 5;
		console.log(n); */

	 setTimeout(() => {
			console.log(1);
		}, 20);
		console.log(2);
		setTimeout(() => {
			console.log(3);
		}, 10);
		console.log(4);
		for (let i = 0; i < 90000000; i++) {
			// do soming  280ms左右
		}
		console.log(5);
		setTimeout(() => {
			console.log(6);
		}, 8);
		console.log(7);
		setTimeout(() => {
			console.log(8);
		}, 15);
		console.log(9); */

解析图片请添加图片描述
变态题目

 console.log(1);
 setTimeout(_ => {
	console.log(2);
  }, 50);
 console.log(3);
 setTimeout(_ => {
   console.log(4);
  // 遇到死循环  =>所有代码执行最后都是在主栈中执行,遇到死循环,主栈永远结束不了,后面啥都干不了了
	 while (1 === 1) {}
 }, 0);
	 console.log(5); 

项目中的实践 +JS中AJAX的异步性`

$.ajax({
	// 随便写了个地址
	url: './js/fastclick.js',
	method: 'get',
	success(result) {
		// 获取数据后动态创建了一个盒子
		$body.append(`<div id='box' class='box'></div>`);
	}
});
// 基于事件委托可以给动态绑定的元数据进行相关的处理
$body.click(function (ev) {
			let target = ev.target,
				$target = $(target);
			if (target.id === 'box') {
				$target.css('background', 'lightcoral');
			}
}); 

 //console.log($('#box')); //=>获取不到元素
//$('#box').click(function () {
//	$(this).css('background', 'lightcoral');
//});
  • 核心都是ajax操作:JQ中的$.ajax是帮我们封装好的ajax库;axios也是基于Promise封装的ajax库
  • fetch是浏览器内置的发送请求的类(天生就是Promise管控的)
 *   AJAX的状态:xhr.readyState
 *   UNSENT 0  创建完XHR默认就是0
 *   OPENED 1  已经完成OPEN操作
 *   HEADERS_RECEIVED 2 服务器已经把响应头信息返回了
 *   LOADING 3  响应主体正在返回中
 *   DONE 4 响应主体已经返回
 * 
* XHR.OPEN第三个参数控制的同步异步指的是:从当前SEND发送请求,算任务开始,一直到AJAX状态为4才算任务结束(同步是:在此期间所有的任务都不去处理,而异步是:在此期间该干啥干啥)  =>异步在SEND后,会把这个请求的任务放在EventQueue中(宏任务)
* 
//案例一 true代表异步
 let xhr = new XMLHttpRequest;
xhr.open('get', './js/fastclick.js', true);
console.log(xhr.readyState); //=>1
xhr.onreadystatechange = function () {
//=>监听到状态改变后才会触发的事件
	console.log(xhr.readyState); //=>2,3,4
};
xhr.send(); 

//案例2 true代表异步
 let xhr = new XMLHttpRequest;
		xhr.open('get', './js/fastclick.js', true);
		xhr.send();
		xhr.onreadystatechange = function () {
			console.log(xhr.readyState); //=>2.3.4
		}; 
//案例3 false代表同步
let xhr = new XMLHttpRequest;
		xhr.open('get', './js/fastclick.js', false);
		xhr.send();
		xhr.onreadystatechange = function () {
			console.log(xhr.readyState);
		}; 
//案例4 false代表同步
	 let xhr = new XMLHttpRequest;
		xhr.open('get', './js/fastclick.js', false);
		xhr.onreadystatechange = function () {
			console.log(xhr.readyState); //=>4
		};
xhr.send(); 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值