JS 异步解决方案的发展历程以及优缺点
1.回调函数(callback)123setTimeout(() => { //回调函数内部}, 1000)
缺点
回调地狱
不能用try catch捕获错误
不能return
回调地狱的根本问题在于:
缺乏顺序性:回调地狱导致调试困难,和大脑的思维方式不符
嵌套函数存在耦合,一旦有所改动,牵一发动全身(控制反转)
嵌套函数过多的话,很难处理错误
优点
解决了同步的问题
2.PromisePromise就是为了解决callback所产生的问题
Promise实现了链式调用,也就是说每次then后返回的都是一个全新的Promise,如果我们在then中return,return 的结果会被 Promise.resolve() 包装
优点:解决了回调地狱
12345678910axios.get(url1).then(res => { //操作 return axios.get(url2)}).then(res => { //操作 return axios.get(url3)}) ...
setTimeout、Promise、Async/Await 的区别
主要是考察这三者在事件循环中的区别,事件循环中分为宏任务队列和微任务队列。其中settimeout的回调函数放到宏任务队列里,等到执行栈清空以后执行;promise.then里的回调函数会放到相应宏任务的微任务队列里,等宏任务里面的同步代码执行完再执行;async函数表示函数里面可能会有异步方法,await后面跟一个表达式,async方法执行时,遇到await会立即执行表达式,然后把表达式后面的代码放到微任务队列里,让出执行栈让同步代码先执行。
Set、Map、WeakSet 和 WeakMap 的区别
Set和Map主要应用场景是数组重组和数据存储
Set是一种叫做集合的数据结构,形式类似于数组,没有键值对;Map是一种叫做字典的数据结构,形式类似于对象,有键值对。
集合(Set)ES6新增的一种新的数据结构,类似于数组,但成员唯一且无序,没有重复的值。
Set本身就是一种构造函数,用来生成Set数据结构
12345678const s = new Set();[1,2,3,4,4,3,2,1].forEach(e => s.add(e))for(let i of s) { console.log(i);//1,2,3,4}//数组去重let arr = [1,2,3,4,4,3,2,1][...new Set(arr)]//[1,2,3,4]
Set允许存储任何类型的唯一值,无论是原始值或者是对象引用
Set加入值的时候,不会发生类型转换,所有5和"5"是两个不同的值。Set内部判断两个值是否不同,使用的算法叫做“Same-value-zero equality”,它类似于精确相等运算符(===),主要的区别是**NaN等于自身,而精 ...
Node+websocket 简易多人聊天室
websocket和node一起搭建一个简单聊天室,全部源码已经上传到github
具体实现环境搭建创建一个文件夹,建立相对应的css目录,js目录(其他可以先不用管)
再根目录下执行命令,安装socket.io
1npm install socket.io
项目搭建1.构建服务器在js目录下建立一个app.js
1234567//app.jslet app = require('http').createServer();let io = require("socket.io")(app);let port = 3000app.listen(port,function(){ console.log("3000端口已启用")})
2.建立服务端socket连接监听大家可以看一下socket.io的文档(1)socket.emit客户端与服务器端之间发送消息是用emit例如客户端向服务端发送登录请求socket.emit(‘event’,data) event是自定义的事件,后面是带的参数(2)soc ...
Cannot Set Headers After They Are Sent to the Client
在nodeJs连接mysql返回语句时老是报这个错误,原因返回了多次响应,所以在每一次返回语句中,要及时加上return
没修改前
12345678910111213141516171819202122232425262728app.get('/addScore', function(req,res){ let query = req.query; console.log(query) var sql = `update team set totalScore = totalScore+${query.score}, count = count+1 where id = ${query.id};` connection.getConnection(function(err, conn){ if (err) { res.send(JSON.stringify({ message:'服务器有问题', status:50 ...
Node连接mysql数据库,封装增删改查
最近写了一下node,用nodejs和vue写了一个很简易的评分管理系统,总计一下在node连接mysql
首先,我们需要安装一下mysql的模块,在你服务器工作目录下执行命令
1npm install mysql --save
在js中引入该模块,配置一下端口号,密码什么的
1234567const mysql = require("mysql");var connection = mysql.createPool({ host: "localhost", user: "root", password: "123456", database: "nodetest"}) //数据库连接配置
接下来来一个简单的测试,我用的是express框架
123456789101112131415app.get('/', function (req, res, next) { connection.getConnection(fun ...
Canvas实现画板(移动端+h5)
代码如下:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889<!DOCTYPE html><html><head> <meta charset="UTF-8" /> <title>画板</title> <style> * { padding: 0; margin: 0; } body { background: #ccc; } canvas { background: #fff ...
原生JS实现Vue双向绑定
原生Js实现Vue双向绑定Vue数据双向数据绑定是通过发布者-订阅者模式来实现的,在正常使用Vue的时候,调用data里的属性是这样的
12345678910var vm = new Vue({ data: { obj: { a: 1 } }, created: function () { console.log(this.obj); }});
里面有一个set和get,这是使用了Object里面的defineProperty,我们新建一个空对象,使用一下这个函数
12345678910111213var Person = {};var name = '';Object.defineProperty(Person,'name',{ set: function(value){ console.log('我被设置 ...
JavaScript手写call,apply,bind
JavaScript手写call,apply,bindcall,apply,bind,都能在JavaScript中改变this指向,那么如何用原生的JS来实现呢?
call实现思路
参考call的语法规则,需要设置一个参数thisArg,也就是this的指向;
将thisArg封装为一个Object;
通过为thisArg创建一个临时方法,这样thisArg就是调用该临时方法的对象了,会将该临时方法的this隐式指向到thisArg上;
执行thisArg的临时方法,并传递参数;
删除临时方法,返回方法的执行结果。
123456789101112131415161718192021222324252627282930/*原生实现call*/Function.prototype.mycall = function(thisArg, ...arr){ //先判断合不合法 if(thisArg === undefined || thisArg === null){ //指向全局window ...
Hexo搭建博客遇到的一些坑
创建仓库的名字一定要是用户名.github.io,我看错了直接创建了用户名仓库,就会报找不到仓库
_config.yml如果配置的是https,每部署一次都会要你输入用户名和密码,换成ssh就不会,例如
1234deploy: type: git repo: git@github.com:Larmyliu/Larmyliu.github.io.git branch: master
3.更换主题后报错extends includes/layout.pug block content include includes/recent-posts.pug include执行命令
1234npm install --save hexo-renderer-jade hexo-generator-feed hexo-generator-sitemap hexo-browsersync hexo-generator-archivehexo chexo g
即可