首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JavaScriptPromise里代码为什么比setTimeout执行

ES3 和更早版本,JavaScript 本身还没有异步执行代码能力,这也就意味着,宿主环境传递给 JavaScript 引擎一段代码,引擎就把代码直接顺次执行了,这个任务也就是宿主发起任务...底层 C/C++ 代码,这个事件循环是一个跑独立线程循环,我们用伪代码来表示,大概是这样: while(TRUE) { r = wait(); execute(r); }...Promise then 回是一个异步执行过程,下面我们就来研究一下 Promise 函数执行顺序,我们来看一段代码示例: var r = new Promise(function(resolve...在这段代码,我设置了两段互不相干异步操作:通过 setTimeout 执行 console.log(“d”),通过 Promise 执行 console.log(“c”)。...setTimeout 后,第二个宏观任务执行调用了 resolve,然后 then 代码异步得到执行,所以调用了 console.log(“c”),最终输出顺序才是: a b c。

82920

TensorFlow2.x执行TensorFlow1.x代码静态图执行模式

TensorFlow2.x执行TensorFlow1.x代码静态图执行模式 改为图执行模式 TensorFlow2虽然和TensorFlow1.x有较大差异,不能直接兼容。...但实际上还是提供了对TensorFlow1.xAPI支持 ---- TensorFlow 2执行或开发TensorFlow1.x代码,可以做如下处理: 导入TensorFlow时使用 import...tensorflow.compat.v1 as tf 禁用即时执行模式 tf.disable_eager_execution() 简单两步即可 举例 import tensorflow.compat.v1...tf.disable_eager_execution() node1 = tf.constant(3.0) node2 = tf.constant(4.0) node3 = tf.add(node1,node2) print(node3) 由于是图执行模式...,这时仅仅是建立了计算图,但没有执行 定义好计算图后,需要建立一个Session,使用会话对象来实现执行执行 sess = tf.Session() print("node1:",sess.run(

83430
您找到你想要的搜索结果了吗?
是的
没有找到

滴滴前端二面必会面试题

,块级作用域可以函数创建也可以一个代码创建(由{ }包裹代码片段)let和const声明变量不会有变量提升,也不可以重复声明循环中比较适合绑定块级作用域,这样就可以把声明计数器变量限制循环内部...此阶段会判断是否存在过期计时器回(包含 setTimeout 和 setInterval),如果存在则会执行所有过期计时器回执行完毕后,如果回触发了相应微任务,会接着执行所有微任务,执行完微任务后再进入...(4)Poll(轮询阶段):当回队列不为空时:会执行,若回触发了相应微任务,这里微任务执行时机和其他地方有所不同,不会等到所有回执行完毕后才执行,而是针对每一个回执行完毕后,就执行相应微任务...setImmediate 回执行了当然某些情况下,他们执行顺序一定是固定,比如以下代码:const fs = require('fs')fs.readFile(__filename, ()...因为两个代码写在 IO 回,IO 回 poll 阶段执行,当回执行完毕后队列为空,发现存在 setImmediate 回,所以就直接跳转到 check 阶段去执行回调了。

39030

javascript如何将字符串转成变量或可执行代码

有这样一个需求:当前作用域内有未知一些变量,其中一个函数可以拿到某个变量名字符串,怎么能在函数内通过传进来字符串取到作用域链变量值,示例小 demo 如下: const name = '周小黑...' const age = 18 /** * @param {String} e 变量名字符串 * @returns value 通过变量名字符串作用域链取到变量值 */ function...return value } const str = fn('name') 要解决上面的问题,主要就是怎么将字符串转变成可执行代码?...主要有三种方式: eval() 函数 eval() 函数会将传入字符串当做 JavaScript 代码进行执行,所以下面的字符串可以正确取到变量对应值,eval 对比 new Function 和...setTimeout 定时器 setTimeout 第一个参数我们平时都是传一个函数,它其实也是可以传字符串进去浏览器是可以正常执行node环境中会报错。

29330

JavaScript 异步编程

主要特征如下: setTimeout:经过任意时间后运行函数,递归 setTimeout JavaScript 线程不阻塞情况下可保证执行间隔相同。...而递归 setTimeout 是调用时才开始算时间,可以保证多次递归调用时间隔相同。 如果当前 JavaScript 线程阻塞,轮到 setInterval 无法执行,那么本次任务就会被丢弃。...而 setTimeout 被阻塞后不会被丢弃,等到空闲时会继续执行,但无法保证执行间隔。 3....单决议:Promise 只能被决议一次(完成或拒绝),不能很好地支持多次触发事件及数据流(支持标准正在制定)。...优点在于可以一个单独线程执行费时处理任务,从而允许主线程任务(通常是 UI)运行不被阻塞/放慢。

94300

再谈谈 Promise, setTimeout, rAF, rIC

快速滚动页面的时候,可视区域内容不断发生变化,浏览器会尽可能快重绘页面,理想帧率为 60。 假设页面有一个注册了回按钮,回执行需要 500 毫秒。...} animation(); 上面的函数假定了浏览器以帧率 60 来运行,但当帧率达不到时候,2 帧之间回可能执行多次,也可能一次都不执行,简称掉帧。...所以制作动画时候,我们不能预设浏览器帧率,正确做法是通过 rAF 注册回, 由浏览器来控制动画调用时机: function animation() { console.log('time...但如果在执行过程往队列添加新任务,新任务不会在当前事件循环中执行,而是在下次事件循环中执行。 idle 队列,每次只会执行一个任务。...任务完成后会检查是否还有空闲时间,有的话会继续执行下一个任务,没有则等到下次有空闲时间再执行。需要注意是此队列任务也有可能阻塞页面,当空闲时间用完后任务不会主动退出。

88410

.NETC# 代码测量代码执行耗时建议(比较系统性能计数器和系统时间)

.NET/C# 代码测量代码执行耗时建议(比较系统性能计数器和系统时间) 发布于 2018-11-06 15:33...不过传统代码编写计时方式依然有效,因为它可以生产环境或用户端得到真实环境下执行耗时。 如果你希望 .NET/C# 代码编写计时,那么阅读本文可以获得一些建议。...基本计时 计时一般采用下面这种方式,方法执行之前获取一次时间,方法结束之后再取得一次时间。 // 方法开始之前。 Foo(); // 方法执行之后。...这样,前后两次获取时间差即为方法 Foo 执行耗时。 这里我不会提到性能测试工具或者基准性能测试这些方法,因为这些测试代码不会运行于用户端。...API QueryPerformanceCounter,微软文档把它称之为 QPC。

3.3K30

JS函数节流和防抖区分和实现详解

节流概念(Throttle) 按照设定时间固定执行一次函数,比如200ms一次。注意:固定就是你mousemove过程执行这个节流函数,它一定是200ms(你设定定时器延迟时间)内执行一次。...没到200ms,一定会返回,没有执行函数。 主要应用场景有:scroll、touchmove 防抖概念(Debounce) 抖动停止后时间超过设定时间时执行一次函数。...如果你一直触发这个函数并且两次触发间隔小于设定时间,则一定不会到回函数那一步。...代码一:首次不执行 function throttle(fn,delay=100){ //首先设定一个变量,没有执行我们定时器时为null let timer = null;...注意: 如果 leading 和 trailing 都设定为 true 则 func 允许 trailing 方式调用条件为: wait 期间多次调用。

1.8K20

js防抖和节流

,直到指定时间间隔内没有再次触发,才会执行函数 缺点:如果事件规定时间间隔内被不断触发,则调用方法会被不断延迟 使用场景:文本框输入搜索(连续输入时避免多次请求接口) 个人通俗理解:事件连续触发...(fn, delay) } } window.onscroll=debounce(showTop,200) 2、节流(throttle) 本质:确保函数特定时间内至多执行一次 原理:用时间戳来判断是否已到回执行时间...,记录上次执行时间戳,然后每次触发 scroll 事件执行,回判断当前时间戳距离上次执行时间戳间隔是否已经到达 规定时间段,如果是,则执行,并更新上次执行时间戳 使用场景:resize、scroll...也可以直接将setTimeout返回标记当做判断条件判断当前定时器是否存在,如果存在表示还在冷却,并且执行fn之后消除定时器表示激活,原理都一样 三、总结 总结: 函数防抖:将多次操作合并为一次操作进行...原理是通过判断是否有延迟调用函数未执行。 区别: 函数节流不管事件触发有多频繁,都会保证规定时间内一定会执行一次真正事件处理函数,而函数防抖只是最后一次事件后才触发一次函数。

1.2K20

模拟实现 Promise(小白版)

Promise 状态变化有两种,成功或失败,状态一旦变更结束,就不会再改变,后续所有注册都能接收此状态,同时异步执行结果会通过参数传递给回函数 使用示例 var p = new Promise...,我们模拟实现时,才能知道到底需要写些什么代码 所以,这里来比较细节罗列下 Promise 基本功能: Promise 有三种状态:Pending(执行)、Resolved(成功)、Rejected...、结果传递 Promise 有一个 then 方法用于注册回调处理,当状态变化结束,注册一定会被处理,即使是状态变化结束后才通过 then 注册 then 方法支持调用多次来注册多个回调处理 then...,用于注册失败回调处理,其实是 then(null, onRejected) 语法糖 task 处理函数或者回函数执行过程发生代码异常时,Promise 内部自动捕获,状态直接当做失败来处理 new...回函数队列 catch 方法 task 处理函数和注册回调处理函数都是使用者使用 Promise 时,自行根据业务需要编写代码 那么,剩下也就是我们实现 Promise 时需要编写代码

1.4K20

带你了解浏览器工作过程

.png 第二步,执行到addAll调用时,生成addAll函数执行上下文,压入上下文,并执执行addAll函数内部执行代码 执行上下文栈.png 第三步,执行到add 函数调用,生成add 函数执行上下文...:undefined-- javascript解析时, 声明和初始化提升,声明之前访问不报错,值为undefined;undefined-- 存放在执行上下文中变量环境undefined-- 可以多次声明同一个变量...--声明会提升,但是初始化不会提升,声明之前访问报错;undefined-- 存放在执行上下词法环境undefined-- 同一作用域内不能多次声明;undefined-- 支持块级作用域 function...Promise 对象,状态为fulfilled(值为参数本身) -- 参数为空,直接返回一个fulfilled状态 Promise 对象,(值为undefined) (5)链式调用时, then回函数执行成功...,处理完成后,then1加入微任务队列(异步任务执行加入微任务队时间是任务异步处理完成时间顺序,不是代码上下位置顺序) 第四部,遇到第二个Promise,promise2, resolve(

1.6K40

从一个超时程序设计聊聊定时器方方面面

如果在逻辑代码访问了临界资源,会不会因为多次定时器重叠触发造成程序死锁? 不会,JS程序是单线程。后面应当触发执行代码,会被前面的延后。...定时器代码,每次都检查一下当前时间与超时时间。这样无论定时器如何偏差,时间总不会错。 使用时间计算超时,这种方案适用于对时间要求不是特别精准场景。...如果在定时器代码,或在交互回函数又添加了新代码,相当于主线程尾部又续接了新代码码,整个主线程像一个雷达波不断扩大,又像一根节节草一节一节循环执行。可以把这一节,称为桢。...,虽然它之前一个间隔为1秒定时器已经被注册了,但在它执行过程,定时器不会触发(JS是单线程);并且它之后,也不会输出3个2。...调用代码示例仅调用3次。实际企业项目开发,对于一些网络请求,可能需要尝试3次甚至多次。 习题 1,下面代码输出是什么?

1.3K20

面试官:reactsetState是同步还是异步_2023-02-19

setStatesetTimeout执行export default class App extends React.Component { state = { num: 0, };...执行,unstable_batchedUpdates函数调用两次setStateimport { unstable_batchedUpdates } from "react-dom";export...react版本如果脱离当前上下文就不会被合并,例如把多次更新放在setTimeout,原因是处于同一个context多次setStateexecutionContext都会包含BatchedContext...,包含BatchedContextsetState会合并,当executionContext等于NoContext,就会同步执行SyncCallbackQueue任务,所以setTimeout多次...mode下,setTimeout多次setState优先级一致呢,因为获取Lane函数requestUpdateLane,只有第一次setState满足currentEventWipLanes

60120

面试官:reactsetState是同步还是异步

setStatesetTimeout执行export default class App extends React.Component { state = { num: 0, };...执行,unstable_batchedUpdates函数调用两次setStateimport { unstable_batchedUpdates } from "react-dom";export...react版本如果脱离当前上下文就不会被合并,例如把多次更新放在setTimeout,原因是处于同一个context多次setStateexecutionContext都会包含BatchedContext...,包含BatchedContextsetState会合并,当executionContext等于NoContext,就会同步执行SyncCallbackQueue任务,所以setTimeout多次...mode下,setTimeout多次setState优先级一致呢,因为获取Lane函数requestUpdateLane,只有第一次setState满足currentEventWipLanes

60220

ES6 Promise用法小结

(Ps:此处执行多次是因为研究该用法时候我一个reactdemo中进行,该页面多个元素改变导致页面多次渲染执行所致,正常页面只渲染一次的话就所有只会执行一次) reject用法 以上是对promise...); } ); 执行结果: (PS:此处也是执行多次所以输出多次执行多次原因和上次原因一致) 以上代码:调用promiseClick方法执行,2秒后获取到一个随机数,如果小于10,我们算成功...它将大于10情况下失败回原因输出,但是,它还有另外一个作用:执行resolve(也就是上面then第一个参数)时,如果抛出异常了(代码出错了),那么并不会报错卡死js,而是会进到这个...即便是有错误代码不会报错了 all用法 与then同级另一个方法,all方法,该方法提供了并行执行异步操作能力,并且在所有异步操作执行完后并且执行结果都是成功时候才执行。...如图2s生成10进入race成功回后,其余函数继续执行,但是将不会再进入race任何回,2s生成16进入了race失败回,其余继续执行,但是将不会再进入race任何回

29720

Node事件循环和异步API

但是:应用层面,JS是单线程,业务代码不能存在耗时过长代码,否则可能会严重拖后续代码(包括回处理。如果遇到需要复杂业务计算时,应当想办法启用独立进程或交给其他服务进行处理。...当主线程发起I/O调用时,I/O操作会被放在I/O线程来执行,主线程继续执行下面的任务,I/O线程完成操作后会带着数据通知主线程发起回。...进行系统调用时,从JS层传入方法和参数都被封装在一个请求对象,请求对象被放在线程池中等待执行。JS立即返回继续后续操作。...1.4 执行 在线程可用时,线程会取出请求对象来执行I/O操作,执行完后将结果放在请求对象,并归还线程。...setTimeout(() => console.log('setTimeout') , 0); }, 0); 以上代码timers阶段执行外部setTimeout后,内层setTimeout

1.6K30

call,apply,bind详解

(obj.say,0); //lucy,this指向window对象 可以观察到,正常情况下 say 方法 this 是指向调用它 obj 对象,而定时器 setTimeout say 方法...this 是指向window对象(浏览器),这是因为 say 方法定时器是作为回函数来执行,因此回到主栈执行时是全局执行上下文环境执行,但我们需要是 say 方法 this...apply方法 apply接受两个参数,第一个参数是this指向,第二个参数是函数接受参数,以数组形式传入,且当第一个参数为null、undefined时候,默认指向window(浏览器),...当一个参数为null或undefined时候,表示指向window(浏览器),和apply一样,call也只是临时改变一次this指向,并立即执行。...bind方法 bind方法和call很相似,第一参数也是this指向,后面传入也是一个参数列表(但是这个参数列表可以分多次传入,call则必须一次性传入所有参数),但是它改变this指向后不会立即执行

83710

面试官:reactsetState是同步还是异步

setStatesetTimeout执行 export default class App extends React.Component { state = { num: 0,...react版本如果脱离当前上下文就不会被合并,例如把多次更新放在setTimeout,原因是处于同一个context多次setStateexecutionContext都会包含BatchedContext...,包含BatchedContextsetState会合并,当executionContext等于NoContext,就会同步执行SyncCallbackQueue任务,所以setTimeout多次...,根本原因在如下一段简化源码,如果多次setState,会比较这几次setState回优先级,如果优先级一致,则先return掉,不会进行后面的render阶段 function ensureRootIsScheduled...mode下,setTimeout多次setState优先级一致呢,因为获取Lane函数requestUpdateLane,只有第一次setState满足currentEventWipLanes

89820

vue使用防抖节流

防抖,一定时间内,多次点击只有一次有效,节流,只要是事件不停止就不会执行。函数也很简单,两者一个不同就是一个清除定时器,一个直接返回。...,节流函数,在你一直点击情况下是不会执行,等你停止点击一秒后执行。...防抖在你一直点击情况下,每隔一秒就会执行一次。...vue方法写法: test(){}, test: function () {} 其实就是ES6函数简写和正常写法,我们防抖节流返回一个函数,所以直接调用然后通过回执行。...MDN上面对this解释:绝大多数情况下,函数调用方式决定了 this 值(运行时绑定)。this 不能在执行期间被赋值,并且每次函数被调用时 this 值也可能会不同。

30910
领券