首页 > 其他分享 >前端面试总结06-异步进阶

前端面试总结06-异步进阶

时间:2022-09-27 00:56:09浏览次数:60  
标签:异步 resolve 06 进阶 err Promise reject catch const

1.事件循环

(1:JS是单线程运行的

(2:异步要基于回调来实现

(3:event loop就是异步回调的实现原理

2.JS如何执行

从前到后一行一行执行

如果某一行执行报错,则停止下面代码的执行

先执行同步代码再执行异步代码

3.eventloop 过程(不包含宏任务与微任务)

(1:同步代码放在call Stack一行一行执行(主栈)

(2:遇到异步,会先“记录”下来等待时机

(3:时机到了就移动到Callback Queue中(任务队列)

(4:如Call Stack为空,EventLoop开始工作

(5:轮询查找Callback Queue,如有则移动到Call Stack中执行

(6:重复上一步轮询查找

4.Dom事件和EventLoop

(1:JS是单线程运行的

(2:异步(setTimeout,ajax等)使用回调,要基于EventLoop来实现

(3:Dom事件也使用回调,基于EventLoop

5.Promise基础

1)Promise三种状态

(1:Promise有三种状态:pending,resolved,rejected

(2:pending->resolved,pending->rejected

(3:变化不可逆

2)状态的表现

(1:pending状态,不会触发then和catch

(2:resolved状态,会触发后续的then回调函数

(3:rejected状态,会触发后续的catch回调函数

3)promise的then和catch如何影响状态的变化

then和catch改变状态

(1:then正常返回resolved,里面有报错则返回rejected

(2:catch正常返回resolved,里面有报错则返回rejected

 

6.async/await

1)async和promise的关系

(1:async/await是消灭异步回调的终极武器

(2:但和promise并不互斥

(3:反而两者相辅相成

(4:执行async函数,返回的是Promise对象

(5:await相当于Promise的then

(6:try...catch..可捕获异常,代替了Promise的catch

 

 

 

 

 

 

 

 

 7.eventloop与dom渲染

每次Call Stack清空(即每次轮询结束),即同步任务执行完

都是dom重新渲染的机会,Dom结构如有改变则重新渲染

然后再去触发下一次EventLoop

8.微任务与宏任务的区别

(1:宏任务:Dom渲染后触发,如setTimeout,setInterval,Ajax,Dom事件

(2:微任务:Dom渲染前触发,如Promise,async/await

(3:微任务执行时机比宏任务要早

 

 

 9.手写Promise

class MyPromise{

constructor(fn){

state='pending'

value=undefined;

reason=undefined;

resolveCallbacks=[];

rejectCallbacks=[];

const resolveHandler=(value)=>{

if(this.state==='pending'){

this.state='fulfilled'

this.value=value;

resolveCallbacks.forEach(fn=>fn(this.value))

}

}

const rejectHandler=(reason)=>{

if(this.state==='pending'){

this.state='rejected'

this.reason=reason;

rejectCallbacks.forEach(fn=>fn(this.reason))

}

try{

fn(resolveHandler,rejectHandler),

}

catch(err){

rejectHandler(err);

}

}

then(fn1,fn2){

fn1=typeof fn1 ==='function'?fn1:(v)=>v;

fn2=typeof fn2 ==='function'?fn2:(e)=>e;

if(this.state==='pending'){

const p1 = new MyPromise((resolve,reject)=>{

this.resolveCallbacks.push((resolve.reject)=>{

 try{

const newValue =fn1(this.value);

resolve(newValue);

}

catch(err){

reject(err);

}

})

this.rejectCallbacks.push((resolve,reject)=>{

try{

const newReason = fn1(this.reason);

reject(newReason);

}

catch(err){

reject(err);

}

})

})

return p1;

}

if(this.state==='fulfilled'){

 const p1 = new MyPromise((resolve,reject)=>{

try{

const newValue = fn1(this.value);

resolve(newValue);

}

catch(err){

reject(err);

}

})

return p1;

}

if(this.state==='rejected'){

 const p1 = new MyPromise((resolve,reject)=>{

try{

const newReason = fn1(this.reason);

reject(newReason);

}

catch(err){

reject(err);

}

})

return p1;

}

}

catch(fn){

return this.then(null,fn);

}

}

MyPromise.resolve=function(value){

return new Promise((resolve,reject)=>resolve(value));

}

MyPromise.reject=function(reason){

return new Promise((resolve,reject)=>reject(reason));

}

MyPromise.all=function(promiseList=[]){

const p1 = new Promise((resolve,reject)=>{

const result =[];

const length = promiseList.length;

let resolveCount = 0;

promiseList.forEach(p=>{

p.then(data=>{

result.push(data);

resolveCount++;

if(resolveCount===length){

resolve(result);

}

}).catch(err=>{

reject(err);

})

})

})

return p1;

}

MyPromise.race = function(promiseList=[]){

let resolve = false;

const p1 = new Promise((resolve,reject)=>{

promiseList.forEach(p=>{

p.then(data=>{

if(!resolve){

resolve(data);

resolve=true;

}

}).catch((err)=>reject(err))

})

})

}

}

 

标签:异步,resolve,06,进阶,err,Promise,reject,catch,const
From: https://www.cnblogs.com/qwqxyd/p/16733108.html

相关文章

  • vue(7)v-model进阶使用
    序简单讲解v-model双向数据绑定的使用,过于简单就不写描述啦,看代码,工具是HBuilderX示例<!DOCTYPEhtml><html> <head> <metacharset="utf-8"/> <title></ti......
  • 106-10-企业级离线数据仓库(二)_ev
              ......
  • day06
    leetcode242.有效的字母异位词进入哈希表章节思路:首先数组本身就是一个简单的哈希表,我们可以利用一个数组来记录元素出现的次数,字母一共有26个,我们可以定义一个长度为26......
  • Java 进阶
    Java进阶1.数组1.1数组的创建注意:new是在堆中创建一个数组或者在堆中分配一块连续的存储空间,把这块空间的引用赋值给数组名还有需要注意的是,数组定义了之后,系统会给......
  • python进阶之路4
    内容回顾PEP8规范代码编写规范及美观python注释语法平时养成写注释的习惯 1.警号 2.三个单引号 3.三个双引号常量与变量1.变量语法结构 变量名......
  • luogu P1772 [ZJOI2006] 物流运输 (dp, 最短路)
    https://www.luogu.com.cn/problem/P1772虽然是图论背景,但是1-n天之间是线性关系。没法贪心决策,考虑dp:我本来写的dp是i-1转移到i,但是这样没法处理哪一天能走哪些最短路......
  • 代码随想录day3● 203.移除链表元素 ● 707.设计链表 ● 206.反转链表
    206.反转链表给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val==val 的节点,并返回 新的头节点 。虚拟头结点法:1ListNode*......
  • 线段树学习笔记(基础&进阶)(一) | P3372 【模板】线段树 1 题解
    什么是线段树线段树是一棵二叉树,每个结点存储需维护的信息,一般用于处理区间最值、区间和等问题。线段树的用处对编号连续的一些点进行修改或者统计操作,修改和统计的复杂......
  • SF2006-ASEMI半塑封快恢复二极管SF2006
    编辑:llSF2006-ASEMI半塑封快恢复二极管SF2006型号:SF2006品牌:ASEMI封装:TO-220AB正向电流:20A反向电压:600V引线数量:3芯片个数:2芯片尺寸:110MIL漏电流:20ua恢复时间:35......
  • 2022-09-06 Invalid default value for prop "value": Props with type Object/Array
    前言:父级给子组件传值,子组件接收传递过来的变量报错:Invaliddefaultvalueforprop"value":PropswithtypeObject/Arraymustuseafactoryfunctiontoreturnthe......