js注意事项4(同步异步)

Posted 嘿起屁儿整

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js注意事项4(同步异步)相关的知识,希望对你有一定的参考价值。

同步、异步

为什么要有同步异步?

  1. JS是单线程的。即一件事情完成后,才能做后续的事情。期间不能进行任何操作
  2. 同步:顺序执行。
  3. 异步:同步全部执行完了再执行。
  4. 异步又分为:宏任务,微任务
  5. 为什么要分同步异步?因为JS是单线程的,一个一个依次执行。举个例子:发请求,网速慢的情况,肯定半天都卡死在这,所以ajax发请求被归为异步。即等那些稳定的同步操作都快速执行完了,再来执行
  6. async await 与 Promise 的作用? 都是优化异步的,作用一样,写法不同。就是因为异步不稳定,怕异步卡住了,所以我们日常代码中发起异步请求都会用他们优化一下。也是避免异步嵌套

前端哪些是异步的?

  1. 定时器(setTimeout、setInterval) ----宏任务
  2. 事件
  3. 异步请求(ajax、axios
  4. 回调函数

异步怎么执行?

  1. 等同步执行完毕,才执行异步。
  2. 异步有对应的队列,也要排队。
  3. 异步先执行微任务,再执行宏任务。

来点例子

首先:声明一下。定时器属于宏任务。

列子1setTimeout(function () 
      console.log(0);
    , 10);
    setTimeout(function () 
      console.log(1);
    , 0);
    console.log(2);
    console.log(3);
    console.log(4);:
那么打印顺序?  2 3 4 1 0
显然同步全部执行完了才执行异步 

例子2new Promise((resolve) => 
    console.log('外层宏事件2');
    resolve()
).then(() => 
    console.log('微事件1');
).then(()=>
    console.log('微事件2')
)
console.log('外层宏事件1');
setTimeout(() => 
    //执行后 回调一个宏事件
    console.log('内层宏事件3')
, 0)
那么打印顺序?
	外层宏事件2
	外层宏事件1
	微事件1
	微事件2
	内层宏事件3

async await 单独使用,并不能让异步 同步化执行(单独使用不能让await等待)

mounted()this.aaa()
methods:
	aaa()
		setTimeout(()=>
			console.log("发请求")
		)
		console.log(123)
	

//打印执行顺序(异步要时间 所以晚执行)
123
发请求
mounted()this.aaa()
methods:
	async aaa()
		let data =await this.getdata()
		console.log(123)
	,
	getdata()
		setTimeout(()=>
			console.log("发请求")
		)
	

//打印执行顺序(异步要时间 所以晚执行)
123
发请求

async await 配合promise使用,可以异步 同步化执行(使同步await等待上一个异步执行完毕再执行)

mounted()this.aaa()
methods:
	async aaa()
		let data =await this.getdata()
		//console.log(data)
		console.log(123)
	,
	getdata()
 	   return new Promise((resolve, reject) => 
        setTimeout(() => 
          console.log("发请求");
          resolve("请求返回数据")
        );
      );
	

//打印执行顺序(异步要时间 所以晚执行)
发请求
123
mounted()this.aaa()
methods:
	async aaa()
		let data =await this.getdata()
		console.log(data)
		console.log(123)
	,
	getdata()
 	  return new Promise((resolve, reject) => 
        	setTimeout(() => 
          		console.log("发请求");
          		resolve("请求返回数据")
        	);
      );
	

//打印执行顺序(异步要时间 所以晚执行)
发请求
请求返回数据
123

接口封装异步

function get(url, params, config = )     
  return new Promise((resolve, reject) => 
    axios.get(url, 
      params,
      ...config,
    ).then(res => 
      resolve(res.data);
    ).catch(err => 
      reject(err.data);
    )    
  );



以上是关于js注意事项4(同步异步)的主要内容,如果未能解决你的问题,请参考以下文章

同步委托最简单的一个列子

关于面试中异步与延时 执行顺序的预期结果问题

JS同步与异步;

同步回调函数与异步回调函数

Passport.js 异步与同步反序列化

event loop笔记