settimeout

20行实现一个Promise

筅森魡賤 提交于 2020-04-05 19:21:31
作者:晨曦时梦见兮 来源: 掘金 前言 在面试的时候,经常会有面试官让你实现一个Promise,如果参照A+规范来实现的话,可能面到天黑都结束不了。 说到Promise,我们首先想到的最核心的功能就是异步链式调用,本篇文章就带你用20行代码实现一个可以异步链式调用的Promise。 这个Promise的实现不考虑任何异常情况,只考虑代码最简短,从而便于读者理解核心的异步链式调用原理。 代码 先给代码吧,真就20行。 function Promise ( excutor ) { var self = this self.onResolvedCallback = [] function resolve ( value ) { setTimeout( () => { self.data = value self.onResolvedCallback.forEach( callback => callback(value)) }) } excutor(resolve.bind(self)) } Promise .prototype.then = function ( onResolved ) { var self = this return new Promise ( resolve => { self.onResolvedCallback.push( function () { var

setTimeout和setInterval

两盒软妹~` 提交于 2020-04-03 16:34:54
(转自: http://www.mxria.com/helps/js_error/trap_error_1572.htm ) 由于 JavaScript 是异步的,可以使用 setTimeout 和 setInterval 来计划执行函数。 注意:定时处理不是ECMAScript 的标准,它们在 DOM (文档对象模型) 被实现。 function foo(){}var id = setTimeout(foo,1000);// 返回一个大于零的数字 当 setTimeout 被调用时,它会返回一个 ID 标识并且计划在将来大约1000 毫秒后调用 foo 函数。 foo 函数只会被执行一次。 基于 JavaScript 引擎的计时策略,以及本质上的单线程运行方式,所以其它代码的运行可能会阻塞此线程。 因此没法确保函数会在 setTimeout 指定的时刻被调用。 作为第一个参数的函数将会在全局作用域中执行,因此函数内的 this 将会指向这个全局对象。 functionFoo(){this.value =42;this.method =function(){// this 指向全局对象 console.log(this.value);// 输出:undefined}; setTimeout(this.method,500);}newFoo(); 注意: setTimeout

使用setTimeout模拟setInterval效果

浪尽此生 提交于 2020-04-02 02:33:38
  由于现在部分浏览器基于对系统性能的优化,在使用setInterval的时候,在页面没有获得关注的状态,浏览器可以会自动将setInterval终端,等到该页面重新获得关注时再开启。这样就会使得一些基于setInterval的定时效果出现意想不到的问题;   解决的办法就是使用setTimeout来模拟setInterval的效果。   具体实现过程如下: var i = 0;function time(){ //每隔1秒让++i console.log(++i); setTimeout(time,1000); } time(); //执行time函数 btn.onclick = function(){ time = null; //重写time函数,从而起到关闭定时器的效果 } 来源: https://www.cnblogs.com/hellobajie/p/5558417.html

JavaScript定时器分析

会有一股神秘感。 提交于 2020-04-01 06:39:37
一、事件循环 JavaScript是单线程,同一个时间只能做一件事情,所以执行任务需要排队。如果前一个耗时很长,那么下一个只能等待。 1)两种任务 为了更好的处理任务,JavaScript语言的设计者将任务分为两种:同步任务(synchronous)与异步任务(asynchronous)。 同步任务 :在主线程上排队执行的任务。 异步任务 :放在“任务队列”(task queue)中,只有当主线程空了,才会将“任务队列”中的任务放到主线程中。 这就是JavaScript的运行机制,这个过程会不断重复,这个机制叫 事件循环 (Event Loop)。 2)事件循环 事件循环模型可以用下图描述,图片来自Philip Roberts的演讲《Help, I’m stuck in an event loop》: 1. “WebAPIs” 内的就是异步任务,包括DOM事件、Ajax和setTimeout。 2. “callback queue” 内的是一个任务队列,包括click、load、done。 3. “stack” 内的就是同步任务,只有当“stack”内的清空后,才会去轮询任务队列。 下面是一段代码说明,图片中的内容是打印结果,没什么悬念。 console.log('Hi'); setTimeout(function() { console.log('there'); },5000)

setTimeout和setImmediate以及process.nextTick的区别

こ雲淡風輕ζ 提交于 2020-03-30 04:37:10
  在javascript中我们了解到了setTimeout和setInterVal函数事件队列(任务队列)的相关知识,除了setTimeout和setInterval这两个方法外,Node.js还提供了另外两个与"任务队列"有关的方法:process.nextTick和setImmediate。它们可以帮助我们加深对"任务队列"的理解。    setTimeout()   首先我们看看setTimeout(setInterVal和setTimeout函数区别只是执行次数)函数,需要注意的是,setTimeout()只是将事件插入了"任务队列",必须等到当前代码(执行栈)执行完,主线程才会去执行它指定的回调函数。要是当前代码耗时很长,有可能要等很久,所以并没有办法保证,回调函数一定会在setTimeout()指定的时间执行。 1 setTimeout(function(){console.log('0')},0);//意思是回调函数加入事件队列的队尾,主线程和事件队列的函数执行完成之后立即执行定时器的回调函数,如果定时器的定时是相同的,就按定时器回调函数的先后顺序来执行。 2 console.log(1); 3 setTimeout(function(){console.log(2);},1000); 4 setTimeout(function(){console.log(4);}

setInterval()、clearInterval()、setTimeout()和clearTimeout()js计数器方法

谁说我不能喝 提交于 2020-03-30 01:21:18
原文地址:http://caibaojian.com/setinterval-settimeout.html window.setInterval()方法 介绍 周期性地调用一个函数(function)或者执行一段 代码 。 语法 var intervalID = window.setInterval(func, delay[, param1, param2, ...]); var intervalID = window.setInterval(code, delay); 这里 intervalID 是此重复操作的唯一辨识符,可以作为参数传给 clearInterval () 。 func 是你想要重复调用的函数。 code 是另一种语法的应用,是指你想要重复执行的一段字符串构成的代码(使用该语法是 不推荐 的,不推荐的原因和 eval() 一样)。 delay 是每次延迟的毫秒数 (一秒等于1000毫秒),函数的每次调用会在该延迟之后发生。和 setTimeout 一样,实际的延迟时间可能会稍长一点。 需要注意的是,IE不支持第一种语法中向延迟函数传递额外参数的功能.如果你想要在IE中达到同样的功能,你必须使用一种兼容代码 (查看c allback arguments 一段). 示例 例1:基本用法 var intervalID = window.setInterval

【javascript基础】【setTimeout setInterval】 之 setTimeout基本概念及浏览器兼容性

夙愿已清 提交于 2020-03-30 01:20:41
一、定义: 在指定的延迟时间之后调用一个函数或者执行一个代码片段. 二、语法: var timeoutID = window.setTimeout(func, delay, [param1, param2, ...]); var timeoutID = window.setTimeout(code, delay); 说明: timeoutID 是该延时操作的数字ID, 此ID随后可以用来作为 window.clearTimeout 方法的参数. func 是你想要在 delay 毫秒之后执行的函数. code 在第二种语法,是指你想要在 delay 毫秒之后执行的代码 (使用该语法是 不推荐的, 不推荐的原因和 eval() 一样) delay 是延迟的毫秒数 (一秒等于1000毫秒),函数的调用会在该延迟之后发生.但是实际的延迟时间可能会稍长一点,查看下面的备注. 需要注意的是,IE不支持第一种语法中向延迟函数传递额外参数的功能.如果你想要在IE中达到同样的功能,你必须使用一种兼容代码 (查看c allback arguments 一段). 备注: 在Gecko 13之前 (Firefox 13.0 / Thunderbird 13.0 / SeaMonkey 2.10), Gecko会给延迟函数传递一个额外的参数,该参数表明了此次延迟操作实际延迟的毫秒数.现在

ES6 Promise --回调与Promise的对比、信任问题、错误处理、Promise的状态、以及Promise对象的常用方法

梦想的初衷 提交于 2020-03-27 15:28:47
之前怎么用回调解决异步的问题: function f(callback){ setTimeout(function(){ callback && callback(); }); } f(function(){ console.log(1); f(function(){ console.log(2); f(function(){ console.log(3); f(function(){ console.log(4); f(function(){ console.log(5); f(function(){ console.log(6); }) }) }) }) }) }) 使用promise实现相同的效果 //使用promise实现相同的效果 function f2(){ return new Promise(resolve=>{//参数传入一个回调函数 setTimeout(function(){ //时执行函数 resolve(); },1000) }) } f2()//只有返回Promise实例,才能.then .then(function(){ console.log(11); return f2(); }) .then(function(){ console.log(22); return f2(); }) .then(function(){ console.log(33)

JS中的定时器-案例解析

和自甴很熟 提交于 2020-03-25 15:46:21
3 月,跳不动了?>>> js定时器的制作 在javascritp中,有两个关于定时器的专用函数,分别为: 1.倒计定时器:timename=setTimeout("function();",delaytime); 2.循环定时器:timename=setInterval("function();",delaytime); 第一个参数“function()”是定时器触发时要执行的动作,可以是一个函数,也可以是几个函数,函数间用“;”隔开即可。比如要弹出两个警告窗口,便可将“function();”换成 “alert('第一个警告窗口!');alert('第二个警告窗口!');”;而第二个参数“delaytime”则是间隔的时间,以毫秒为单位,即填写“5000”,就表示5秒钟。    倒计时定时器是在指定时间到达后触发事件,而循环定时器就是在间隔时间到来时反复触发事件,两者的区别在于:前者只是作用一次,而后者则不停地作用。 比如你打开一个页面后,想间隔几秒自动跳转到另一个页面,则你就需要采用倒计定时器“setTimeout("function();",delaytime)” ,而如果想将某一句话设置成一个一个字的出现, 则需要用到循环定时器“setInterval("function();",delaytime)” 。 获取表单的焦点,则用到document

原生js深入理解系列(七)--- 读JavaScript 执行机制的一点小总结

微笑、不失礼 提交于 2020-03-24 20:30:40
3 月,跳不动了?>>> 总结: js的执行机制是:单线程运行,主线程跑任务,线程队列一个一个宏任务来运行,并且把宏任务内的微任务的全部运行完再继续下一个宏任务。 首先是同步执行其次是异步执行 除了广义的同步任务和异步任务,我们对任务有更精细的定义: macro-task(宏任务):包括整体代码script,setTimeout,setInterval micro-task(微任务):Promise,process.nextTick(promise的回调then()是微任务) 主线程里立即执行的是:new promise, promise 语句, console.log 按出现的先后执行 立即执行的执行完后执行同一个宏任务里的微任务队列,微任务依次执行完毕后再继续下一个宏任务。下面请看掘金作者ssssyoki大佬的娓娓道来,为我们彻底的细致的理解js的执行机制。 这一次,彻底弄懂 JavaScript 执行机制 本文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还不懂,可以揍我。 不论你是javascript新手还是老鸟,不论是面试求职,还是日常开发工作,我们经常会遇到这样的情况:给定的几行代码,我们需要知道其输出内容和顺序。因为javascript是一门单线程语言,所以我们可以得出结论: javascript是按照语句出现的顺序执行的 看到这里读者要打人了