当前位置: 首页 > ds >正文

WebGIS开发面试题:前端篇(三)

本系列内容主要介绍webgis开发过程中可能会遇到的常见面试题和答案,从前端到二维到三维,干货满满。记得关注我不走丢!

需要更多面试题、视频讲解、webgis教程的宝子戳↓↓↓
GIS学习

前几期内容点击下方链接:
WebGIS开发面试题:前端篇(一)
WebGIS开发面试题:前端篇(二)

1、同步异步

异步和单线程

  • JS是单线程语⾔,只能同时做⼀件事。

  • 浏览器和node.js已⽀持JS启动进程,如Web Worker。

  • JS和DOM渲染共用同⼀个线程,因为JS可修改DOM结构。

异步是因为单线程而来的。

那么遇到等待(网络请求,定时任务)不能卡住,所以需要异步,异步是基于回调callback函数形式。

异步

//异步 
console.log(100); 
setTimeout(()=>{ 
console.log(200)
},1000) //callback 
console.log(300); 
//异步不会阻塞代码的执⾏。

同步

console.log(100); 
alert(200); 
console.log(300); 
//同步会造成线程的阻塞。

总结

  • JS 是单线程的语⾔

  • 异步不会阻塞代码的执行

  • 同步会阻塞代码执行

应用****场景

网络请求,如何ajax-图片加载

定时任务,如setTimeout

题目

console.log("start"); 
let img = document.createElement("img"); 
img.onload = function(){ 
console.log("load"); 
} 
img.src= "react.jpg"; 
console.log(img) 
console.log("end")

2、promise

**1-1 promise有几种状态 **

pending 
fulfilled 
rejected

pending

var p = new Promise(() => { }); 
console.log(p)

fulfilled

var f = new Promise((resolve, reject) => { 
resolve(1) 
}) 
console.log(f)

rejected

var r = new Promise((resolve, reject) => { 
reject(1) 
}) 
console.log(r)

**1-2 状态之间的切换 **

pending–>fulfilled

var f = new Promise((resolve, reject) => { 
setTimeout(()=>{ 
resolve(1); 
},1000) 
}) 
console.log(f)

pending -->rejected

var r = new Promise((resolve, reject) => { 
setTimeout(()=>{ 
reject(1); 
},1000) 
}) 
console.log(r)

1-3 触发状态

**1-3-1 正常触发 **

1.正常情况下catch和then的返回值都是fulfilled的状态

2.触发函数中存在报错的情况,返回值是rejected的状态

// then 
var p= new Promise((resolve, reject) => { 
resolve(1); 
reject(2); 
}) 
var r = p.then(res=>{ 
console.log(res) 
}) 
console.log(r) //fulfilled 
//catch 
var p= new Promise((resolve, reject) => { 
reject(2); 
}) 
var c = p.catch(err=>{ 
console.log(err) 
}) 
console.log(c) //fulfilled
//catch 语句报错 
var p= new Promise((resolve, reject) => { 
reject(2); 
}) 
var r = p.catch(res=>{ 
console.log(res) 
throw "error" 
}) 
console.log(r)

1-3-3 then和catch函数报错之后的触发

then和catch报错之后,获取的状态rejected,那么这种状态只能使用catch函数去调用

var p= new Promise((resolve, reject) => { 
resolve(1); 
reject(2); 
}) 
var r = p.then(res=>{ 
console.log(res) 
throw "error" 
}) 
var t = r.catch(res=>{ 
console.log(res) 
}) //

1-4 promise实现图片加载

const url ="react.jpg"; 
function loadImg(src){ 
return new Promise((resolve,reject)=>{ 
const img = document.createElement("img"); img.onload = ()=>{ 
resolve(img); 
} 
img.onerror = ()=>{ 
reject(new Error("图⽚加载失败")) 
} 
img.src = src; 
}) 
} 
loadImg(url).then(res=>{ 
console.log(res.width) 
}).catch(err=>{ 
console.log(err) 
})

3、Async,await-catch

(async()=>{ 
try{ 
var res = await jjf; }catch(err){ 
console.log(err); } 
})();

Event-Loop

JS是单线程运行的
异步要基于回调来实现
event loop就是异步回调的实现原理

JS如何执行

从前到后,⼀行⼀行执行
如果某⼀行执行报错,则停止下⾯代码的执行
先把同步代码执行完,再执行异步代码

console.log(“start”); setTimeout(()=>{
console.log(“callback”) },2000)
console.log(“end”);

同步代码执⾏完毕,就会启动event-loop,是浏览器内核启动的。

4、调用栈

1、console.log(“start”)执行先将其放在调用栈中,控制台输出"start"

2、console.log(“start”)执行完毕,将其从调用栈中移除

接着将setTimeout()函数到调用栈中,因为它是⼀个webAPI,那么在webAPI中有⼀个定时器。

3、调用栈中移除setTimeout(),执行console.log(“end”)

4、console.log(“end”)执行之后,也从调用栈中移除

5、同步代码执行完毕之后,Event Loop会不断的循环callback Queue,看里面是否有异步任务

6、最后Event Loop会将callback Queue中的代码放到调用栈⾥去

7、 callback在调用栈中被执行完毕之后,被从调用栈中移除

Tips:这地方会等待3s之后,callback函数才会被放到Callback Queue中,被Event Loop捕获。

总结:

1-1 同步代码,⼀行⼀行放在call stack执行
1-2 遇到异步,会先"记录"下,等待时机(定时,网络请求)
1-3 时机到了,就移动到Callback Queue
1-4 Call Stack为空(即同步代码执行完)Event–Loop开发工作。

1-5 轮询查找Callback Queue,如有则移动到Call Stack执行。

1-6 继续轮询查询(永动机⼀样)

5、Event-Loop和Promise

  • 微任务是ES6语法规定的

  • 宏任务是由浏览器规定的

总结

  • 宏任务有哪些?微任务有哪些?微任务触发时机更早

  • 微任务、宏任务和DOM渲染的关系

  • 微任务、宏任务和DOM渲染,在event loop的过程

http://www.xdnf.cn/news/4579.html

相关文章:

  • 深入理解Java反射机制
  • 基于Node.js的Web爬虫: 使用Axios和Cheerio抓取网页数据
  • 强化学习之蒙特卡洛树搜索和噪声网络
  • 精益数据分析(45/126):媒体网站商业模式的深度剖析与挑战应对
  • 【Python】字符串 转为 JSON 格式的注意事项
  • ASP.NET MVC4 技术单选及多选题目汇编
  • 策略优化基础网格搜索与参数优化
  • 交替序列长度的最大值
  • Feign 重试策略调整:优化微服务通信的稳定性
  • pod声明周期
  • 行业先锋:六款产品的实战表现
  • PageRank和TextRank
  • 源码分析之Leaflet中的LayerGroup
  • LLM :Function Call、MCP协议与A2A协议
  • 基于神经网络的 YOLOv8、MobileNet、HigherHRNet 姿态检测比较研究
  • uniapp-商城-43-shop 后台管理 页面
  • 音频相关基础知识
  • JavaScript ES6+ 最佳实践
  • 将Dify平台开发的工作流集成到Open WebUI中
  • 金融小知识
  • 【实战教程】零基础搭建DeepSeek大模型聊天系统 - Spring Boot+React完整开发指南
  • ChromaDB调用BGE模型的两种实践方式
  • 学习基本开锁知识
  • 【一篇详解】深入浅出RabbtiMQ消息队列
  • 阿里云平台与STM32的物联网设计
  • Python训练营打卡DAY18
  • 电气工程中漏源电压Vds的平台电压是什么?
  • 芳草集精油怎么样?佰草集精油的功效与用法一览
  • 利用相场法来求解任意脆性断裂问题
  • Notepad++中XML格式化插件介绍