您的位置:首页 > 大数据 > 人工智能

es7关键字async await,跨域,事件循环

2019-08-06 22:55 295 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_24790575/article/details/98663690

关键字 async await 如果函数声明之前添加了关键字async那么这个函数返回值就是一个Promise.resolve()包裹,是一个promise对象。await只能在async函数中使用。 使用await会影响性能,代码无法并发。但是执行代码是参照事件循环执行机制执行的。所以一般使用这一对关键字时说明这个函数内执行的程序必须按照特定的顺序执行才能正确的完成任务。所以要是可并发无关联的代码建议还是直接使用promise对象。
Proxy 是es6新加的功能,可以自定义对象中的操作。
跨域,出现原理是浏览器的同源策略。协议,域名,端口有一个不同就是跨域。
常见解决跨域的方法 有四种。
1、jsonp,原理就是利用Script标签没有跨域限制的漏洞,通过

//发送消息端
window.parent.postMessage('message', 'http://test.com')
// 接收消息端
var mc = new MessageChannel()
mc.addEventListener('message', event => {
var origin = event.origin || event.originalEvent.origin
if (origin === 'http://test.com') {
console.log('验证通过')
}
})
/ 发送消息端
window.parent.postMessage(‘message’, ‘http://test.com’)
// 接收消息端
var mc = new MessageChannel()
mc.addEventListener(‘message’, event => {
var origin = event.origin || event.originalEvent.origin
if (origin === ‘http://test.com’) {
console.log(‘验证通过’)
}
})

这种情况还没有使用过,也没有遇见过,根据经验应该是3那种情况有单点登录的项目应该用的到。
事件循环
这个对于js来说非常重要因为他会决定了你代码真正的执行顺序,决定了你写的处理结果正不正确。事件队列task。
不同的任务源会被分配到不同的 Task 队列中,任务源可以分为 微任务(microtask) 和 宏任务(macrotask)。在 ES6 规范中,microtask 称为 jobs,macrotask 称为 task。setTimeout的延迟时间不可能小于4毫秒。
微任务包括 process.nextTick ,promise ,Object.observe ,MutationObserver
宏任务包括 script , setTimeout ,setInterval ,setImmediate ,I/O ,UI rendering
所以正确的一次 Event loop 顺序是这样的
1、执行同步代码,这属于宏任务
2、执行栈为空,查询是否有微任务需要执行
3、执行所有微任务
4、必要的话渲染 UI
5、然后开始下一轮 Event loop,执行宏任务中的异步代码
按我的理解翻译一遍就是先用全局对象执行所有代码,这是第一个宏任务,遇见属于宏任务和微任务的直接放到事件队列里等待真正执行,然后继续执行其他可以执行代码,当执行完当前可以执行的所有代码后,第一轮任务执行完毕,然后将事件队列里的微任务拿出来执行,当把所有能执行的微任务执行完后就可以指向下一个可以执行的宏任务了,然后在这个宏任务里再去一边执行可执行代码一边把属于红任务和微任务的放到事件队列里,然后执行完后执行事件队列里的微任务,然后在执行下一个可以执行的宏任务,然后如上一样循环执行。
以上属于浏览器事件循环机制再看node
node是直接分为6个阶段
1.timers timers 阶段会执行 setTimeout 和 setInterval
2.I/O 阶段会执行除了 close 事件,定时器和 setImmediate 的回调
3.idle, prepare 阶段内部实现
4.poll
poll 阶段很重要,这一阶段中,系统会做两件事情

执行到点的定时器
执行 poll 队列中的事件
并且当 poll 中没有定时器的情况下,会发现以下两件事情
如果 poll 队列不为空,会遍历回调队列并同步执行,直到队列为空或者系统限制
如果 poll 队列为空,会有两件事发生
如果有 setImmediate 需要执行,poll 阶段会停止并且进入到 check 阶段执行 setImmediate
如果没有 setImmediate 需要执行,会等待回调被加入到队列中并立即执行回调
如果有别的定时器需要被执行,会回到 timer 阶段执行回调。
5.check
check 阶段执行 setImmediate
6.close callbacks 阶段执行 close 事件
本人对于node执行机制理解是这样的,先从timer执行延时器或者定时器,第二几段执行除了colse 定时器 setImmediate之外的回调。
poll阶段是先看有没有到点的定时器任务,有就执行,没有就看poll队列是否还有方法没有执行,有就执行,没有就看有没有setImmediate,有就直接进入check执行setImmediate ,如果都没有了看有没有定时器需要启动执行,有就直接回到timers阶段,没有就等待回调继续往下执行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: