js异步和单线程

1、同步和异步的区别

a>同步会阻塞代码执行,异步不会

b>alert()是同步  setTimeout()是异步

2、关于setTimeout();

console.log(1);

setTimeout(function() { console.log(2);}, 0);

console.log(3);

setTimeout(function() { console.log(4);}, 0);

console.log(5);

// 13524

3、前端执行异步的场景:

a>定时任务

b>网络请求   ajax  请求  动态img

c>事件绑定

4、什么是异步:

console.log(100);

setTimeout(function() { console.log(200);}, 0);

console.log(300);

// 100 300 200

异步结果:100 300(不做等待) 200

同步结果:100 200(等待) 300   (会阻塞后面代码的运行)

对比alert();

console.log(100);

alert(200);

console.log(300);

结果:// 100  200   点击确认    300

5、什么时候需要异步?

a>可能发生等待的情况

b>不能像alert一样阻塞程序运行

换言之,所有的“等待的情况”都需要异步

6、前端使用异步的场景:

a>定时任务

b>ajax

demo1:ajax请求

console.log(‘start‘);

$.get(‘XXX‘, function(data) {

console.log(data);

});

console.log(end);

执行结果: // start  end  object

分析:

ajax请求需要等待

过程:a》打印start

b》执行 $.get 后,函数 data1 会被暂存起来,不会立即执行(单线程的特点,不能同时干两件事)

c》执行最后一行,打印300

d》待所有程序执行完,处于空闲状态时,会立马看有没有暂存起来的要执行

e》发现暂存起来的 $.get 中的 data1 未执行,待请求 data1.json返回 后,立即执行 data1

demo2:动态图片的加载

console.log(‘start‘);

const img = document.getElementById(‘img’);

img.onLoad = function() {

console.log(‘loadImg‘);

};

console.log(end);

执行结果: // start   loadImg  end       不知道图片何时完成加载,需要等待

demo3:事件绑定

console.log(‘start‘);

document.getElementById(‘box‘).on(click, function() {cosnole.log(‘click);});

console.log(‘end‘);

// start end      (点击)click     不知道用户何时点击,需要等待

7、异步和单线程:

JS 是单线程的语言,所谓“单线程”就是一根筋,对于拿到的程序,一行一行的执行,直到上面的执行为完成,只能做这一件事

原文地址:https://www.cnblogs.com/echo-HE/p/10185148.html

时间: 2024-10-03 15:48:38

js异步和单线程的相关文章

浅析JS异步执行机制

前言 JS异步执行机制具有非常重要的地位,尤其体现在回调函数和事件等方面.本文将针对JS异步执行机制进行一个简单的分析. 从一份代码讲起 下面是两个经典的JS定时执行函数,这两个函数的区别相信对JS有一定基础的同学是十分清楚的.timeout仅仅只会执行一次,而interval则会执行多次. setTimeout(function (args) { console.log('timeout') }, 1000); setInterval(function (args) { console.log

Javascript教程:js异步编程的4种方法详述(转载)

文章收集转载于(阮一峰的网络日志) 你可能知道,Javascript语言的执行环境是“单线程”(single thread). 所谓“单线程”,就是指一次只能完成一件任务.如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推. 这种模式的好处是实现起来比较简单,执行环境相对单纯:坏处是只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行.常见的浏览器无响应(假死),往往就是因为某一段Javascript代码长时间运行(比如死循环),导致整个页面卡在这个地方

JS有趣的单线程

一.JS的执行特点 源于单线程的特性, JS在一段时间内只能执行一部分代码, 那么, 当有多块代码需要执行时, 就需要排队等候了. 二.单线程与异步事件 (1) 什么是异步事件? 异步事件是像鼠标点击.计时器释放.XMLHttpRequest请求完成这样的动作, 由于我们不知道它何时执行, 所以, 可以认为它是不同步的(这些说明只能作为帮助理解的参考, O(∩_∩)O). (2) 异步事件是否会受到单线程的影响? 答案是肯定的: 异步事件也必须排队等候(即异步事件对应的JS回调函数, 也必须排队

一个小例子理解js异步加载

前几天笔试某公司有这样一道题.编写一个javascript函数,可以在页面上异步加载js,在加载结束后执行callback,并在IE和chrome下可以执行. 就这个题我写了一个DOM方法异步加载js的例子,可以给对于异步不了解的朋友参考感受一下. 众所周知,js是一种单线程的语言,它的Event Loop机制可以看一下阮一峰的这篇博客,讲解的很好 http://www.ruanyifeng.com/blog/2014/10/event-loop.html 下面看一下我写的例子 1 <!DOCT

深入解析js异步编程利器Generator

我们在编写Nodejs程序时,经常会用到回调函数,在一个操作执行完成之后对返回的数据进行处理,我简单的理解它为异步编程. 如果操作很多,那么回调的嵌套就会必不可少,那么如果操作非常多,那么回调的嵌套就会变得让人无法忍受了. 我们知道的Promises就是问了解决这个问题而提出来的.然而,promises并不是一种新的功能,它只是一种新的写法,原来横向发展的回调函数,被排成了队竖向发展. 然而,Generator不同,它是一种新的解决方案. 文章中提到的所有代码都可以在这里找到源码:[查看源码].

js异步处理工作机制

js异步处理工作机制 从基础的层面来讲,理解JavaScript的定时器是如何工作的是非常重要的.计时器的执行常常和我们的直观想象不同,那是因为JavaScript引擎是单线程的.我们先来认识一下下面三个函数是如何控制计时器的. var id = setTimeout(fn, delay); - 初始化一个计时器,然后在指定的时间间隔后执行.该函数返回一个唯一的标志ID(Number类型),我们可以使用它来取消计时器. var id = setInterval(fn, delay); - 和se

js异步之惑

js异步之惑 1.异步是啥 与异步对应的就是同步,对于同步我们很好理解,就是代码顺序执行.但是一到异步代码,很多人多少有些理不清.异步,从功能上讲,就是在背后偷偷的执行,不堵塞当前运行的代码:从实现上讲,能够这么做的,就只能靠在当前运行代码中另一起线程或者进程了.举一个使用线程来实现异步的例子: public class MyAsync extends Thread { private volatile boolean done = false; public void run() { whil

JS异步编程 (1)

JS异步编程 (1) 1.1 什么叫异步 异步(async)是相对于同步(sync)而言的,很好理解. 同步就是一件事一件事的执行.只有前一个任务执行完毕,才能执行后一个任务.而异步比如: setTimeout(function cbFn(){ console.log('learnInPro'); }, 1000); console.log('sync things'); setTimeout就是一个异步任务,当JS引擎顺序执行到setTimeout的时候发现他是个异步任务,则会把这个任务挂起,

Javascript的异步与单线程

一.前言 我们都知道,javasript是一个单线程的语言:所谓单线程就是同一时间不能做两件事情,两段代码不能同时执行:因为这种机制,才避免了两段js同时对一个DOM节点进行渲染的冲突.但是也会因此产生一个问题,比如说有一个非常耗时的操作在js中执行,因为js是按顺序执行的,所以会导致代码一直卡在这个耗时的方法那里,从而造成页面假死的状态,为了解决这个问题,js也提供了一些解决方案,比 如Ajax.setTimeout.setInterval,提供了异步的解决方案.有人会说,那单线程和异步同时存