今天下午看了好多关于这些执行顺序的问题  经过自己的实践 终于理解了  记录一下就拿网上出现频繁的代码来说: async function async1() { console.log('async1 start'); await async2(); console.log('asnyc1 end'); } async function async2() { console.log('async2'); } console.log('script start'); setTimeout(() =…
随着async/await正式纳入ES7标准,越来越多的人开始研究据说是异步编程终级解决方案的 async/await.但是很多人对这个方法中内部怎么执行的还不是很了解,本文是我看了一遍技术博客理解 JavaScript 的 async/await(如果对async/await不熟悉可以先看下这篇文章)后拓展了一下,我理了一下await之后js的执行顺序,希望可以给别人解疑答惑,先简单介绍一下async/await. async/await 是一种编写异步代码的新方法.之前异步代码的方案是回调和…
什么是事件循环?想要了解什么是事件循环就要从js的工作原理开始说起: JS主要的特点就是单线程,所谓单线程就是进程中只有一个线程在运行. 为什么JS是单线程的而不是多线程的呢? JS的主要用途就是与用户交互,操作DOM,假设JS同时有两个线程,一个线程中在某个DOM节点上添加或者修改内容,而另一个线程在这个DOM节点上执行删除该节点操作,这样就会产生冲突. 单线程就意味着所有任务都需要排队,前一任务结束,才会执行后一个任务,当是如果当遇到前一个任务耗时很长的情况,后一个任务就不得不一直等着.因此…
今天有幸好碰到一个bug,让我知道了之前我对await async 的理解有点偏差. 错误的理解 之前我一直以为  await 后面的表达式,如果是直接返回一个具体的值就不会等待,而是继续执行async function 中的函数, 如下demo: method () { getParams () { let params = {} if (this.serachFrom.time !== 0) { params.month = this.serachFrom.time.substr(5, 2)…
/* 原则: 执行完当前promise, 会把紧挨着的then放入microtask队尾, 链后面的第二个then暂不处理分析, */ 一. new Promise((resolve, reject) => { console.log("promise1") resolve() }).then( () => { console.log("then11") new Promise((resolve, reject) => { console.log(…
首先js是单线程 分为同步和异步,异步又分为(macrotask 宏任务 和 microtask微任务 ), 这图还是很清晰嘛,再来一张 总结一下,就是遇到同步先执行同步,异步的丢到一边依次排队,先排队的异步先执行,等同步执行完了,在来处理异步,异步又分宏任务和微任务,一个宏任务执行完了才会轮到下一个 宏任务. 重点说一下微任务,微任务就像宏任务的小弟,这个微任务执行完了,才代表这论宏任务执行完,才会执行下一个宏任务,明白了瑟!(网上有篇文章来比喻这个很好,就像银行排队办业务一样,宏任务 根据拿…
在For循环中执行setTimeOut()方法的代码,执行顺序是怎样的呢? 代码如下 function time() { for(var i= 0;i<5;i++){ setTimeout(function () { console.log(i); },1000) } } time(); 应该会有人会说,很简单呀,for循环进行遍历,并且每次有一个输出,那结果应该是0,1,2,3,4. 其实不然,运行上诉代码之后,控制台输出如下:5个5 下面解释下为什么是5个5. 首先关于最开始贴的代码,我们是…
解答这个题目之前,先回顾下JavaScript的事件循环(Event Loop). JavaScript的事件循环 事件循环(Event Loop):同步和异步任务分别进入不同的执行"场所",同步的进入主线程,异步的进入Event Table并注册函数.当指定的事情完成时,Event Table会将这个函数移入Event Queue.主线程内的任务执行完毕为空,会去Event Queue读取对应的函数,进入主线程执行.上述过程会不断重复,也就是常说的Event Loop(事件循环).流…
写这个问题是因为最近看到一些初学者用回调用的不亦乐乎,最后代码左调来又调去很不直观. 首先上结论:推荐使用async/await或者co/yield,其次是promise,再次是事件,回调不要使用. 接下来是解析,为什么我会有这样的结论 首先是回调,理解上最简单,就是我把任务分配出去,当你执行完了我就能从你那里拿到结果执行相应的回调, 这里演示一个对setTimeout的封装,规定时间后打印相应结果并执行回调函数 并且这个函数传给回调函数的参数符合node标准,第一个为error信息,如果出错e…
一.背景 1.Node.js 异步控制 在之前写的 callback vs async.js vs promise vs async / await 里,我介绍了 ES6 的 promise 和 ES7 的 async / await 的基本用法. 可以肯定的是,node.js 的异步控制(asynchronous JavaScript),promise 就是未来的主流,诸如 async.js 等非 promise 库( async.js 基于 callback )终将被淘汰,而基于 promi…