本文将会简绍以下内容
- 异步与同步
- 回调函数
- Promise
- 跨域
- 同源策略
- CORS
- JSONP
异步与同步
异步:不等任务执行完,就直接执行下一个任务;书写顺序和执行顺序不一样
下面这个代码的书写顺序是 1 -> 2 -> 3;但是执行顺序是 1 -> 3 -> 2。这就是异步
console.log(1) setTimeout(function(){ console.log(2) },0) console.log(3)
同步: 一定要等任务执行完了,得到结果,才执行下一个任务。
function A = function(){ return '同步任务的返回值' } var result = A() // 那么 result 就是同步任务的结果 B() // 然后执行下一个任务
同步:是所有的操作都做完,才返回给用户结果。即写完数据库之后,再响应用户,用户体验不好。
异步:不用等所有操作都做完,就响应用户请求。即先响应用户请求,然后慢慢去写数据库,用户体验较好。
如何判断同步异步?
如果一个函数的返回值处于 setTimeout, AJAX,addEventListener这三个东西内部,那么这个函数就是异步函数
回调函数
你写给别人用的函数就是回调函数
Promise
Promise 是异步编程的一种解决方案:从语法上讲,promise是一个对象,从它可以获取异步操作的消息;从本意上讲,它是承诺,承诺它过一段时间会给你一个结果。promise有三种状态:pending(等待态),fulfiled(成功态),rejected(失败态);状态一旦改变,就不会再变。创造promise实例后,它会立即执行。
promise是用来解决两个问题的:
- 回调地狱,代码难以维护, 常常第一个的函数的输出是第二个函数的输入这种现象
- promise可以支持多个并发的请求,获取并发请求中的数据
跨域
浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议有一个不同,都是跨域;
即指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制
同源策略
同源定义: 如果两个url的协议,域名,端口号完全一致,那么这两个url就是同源的
源: 在任意一个浏览器打印 window.origin 或location.origin可以得到当前源
源=协议+域名+端口号
同源策略定义: 浏览器规定,如果JS运行在源A里,那么就只能获取源A的数据不能获取源B的数据,即不允许跨域。目的就是为了保护用户隐私
CORS
CORS: 跨源资源共享
就是解决不同源之间数据的访问
在被访问源的响应头里提前声明,指明此数据谁可以访问: http://dong.com:9990
可以访问了
response.setHeader("Access-Control-Allow-Origin", "http://dong.com:9990");
但是IE 6,7,8,9 不支持CORS,可以使用JSONP
JSONP
JSONP : 在跨域的时候浏览器不支持cors,必须使用另外一种方式跨域,于是我们就请求一个js文件,这个js文件会执行一个回调,回调里面就有我们的数据,回调函数名字可以是一个随机数,把这个名字以callback参数传给后台,后台会把这个参数返回过来并执行;
优点: 兼容ie,可以跨域
缺点: 由于是script标签,它拿不到状态码和响应头,只知道成功和失败,只能发get请求,不支持post
1.jsonp跨域方法是新建一个js文件里面写上一个占位符{{data}} 2.在后端路由里将json数据文件转化成字符串 3.再将js文件转化成字符串 4.然后用json字符串 替换掉{{data}}
这样就可以跨域访问了,但是还是有一个问题,这个js所有人都可以访问,不安全
解决方法:是由referer检验,在路由哪判断一下是否允许访问