javascript同步和异步的区别与实现方式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript同步和异步的区别与实现方式相关的知识,希望对你有一定的参考价值。

javascript语言是单线程机制。所谓单线程就是按次序执行,执行完一个任务再执行下一个。

对于浏览器来说,也就是无法在渲染页面的同时执行代码。

单线程机制的优点在于实现起来较为简单,运行环境相对简单。缺点在于,如果中间有任务需要响应时间过长,经常会导致

页面加载错误或者浏览器无响应的状况。这就是所谓的“同步模式”,程序执行顺序与任务排列顺序一致。对于浏览器来说,

同步模式效率较低,耗时长的任务都应该使用异步模式;而在服务器端,异步模式则是唯一的模式,如果采用同步模式个人认为

服务器很快就会出现12306在高峰期的表现。。。。

异步模式的四种方式:

1.回调函数callback

所谓回调函数,就是将函数作为参数传到需要回调的函数内部再执行。

典型的例子就是发送ajax请求。例如:

$.ajax(

async: false,

cache: false,

dataType: \'json\',

url: "url",

success: function(data)

console.log(\'success\');

,

error: function(data)

console.log(\'error\');



)

当发送ajax请求后,等待回应的过程不会堵塞程序运行,耗时的操作相当于延后执行。

回调函数的优点在于简单,容易理解,但是可读性较差,耦合度较高,不易于维护。

2.事件驱动

javascript可以称之为是基于对象的语言,而基于对象的基本特征就是事件驱动(Event-Driven)。

事件驱动,指的是由鼠标和热键的动作引发的一连串的程序操作。

例如,为页面上的某个
$(\'#btn\').onclick(function()

console.log(\'click button\');

);

绑定事件相当于在元素上进行监听,是否执行注册的事件代码取决于事件是否发生。

优点在于容易理解,一个元素上可以绑定多个事件,有利于实现模块化;但是缺点在于称为事件驱动的模型后,流程不清晰。

3.发布/订阅

发布订阅模式(publish-subscribe pattern)又称为观察者模式(Observer pattern)。

该模式中,有两类对象:观察者和目标对象。目标对象中存在着一份观察者的列表,当目标对象

的状态发生改变时,主动通知观察者,从而建立一种发布/订阅的关系。

jquery有相关的插件,在这不是重点不细说了。。。。回头写个实现贴上来

4.promise模式

promise对象是CommonJS工作组提供的一种规范,用于异步编程的统一接口。

promise对象通常实现一种then的方法,用来在注册状态发生改变时作为对应的回调函数。

promise模式在任何时刻都处于以下三种状态之一:未完成(unfulfilled)、已完成(resolved)和拒绝(rejected)。以CommonJS
Promise/A
标准为例,promise对象上的then方法负责添加针对已完成和拒绝状态下的处理函数。then方法会返回另一个promise对象,以便于形成promise管道,这种返回promise对象的方式能够支持开发人员把异步操作串联起来,如then(resolvedHandler,
rejectedHandler); 。resolvedHandler
回调函数在promise对象进入完成状态时会触发,并传递结果;rejectedHandler函数会在拒绝状态下调用。

Jquery在1.5的版本中引入了一个新的概念叫Deferred,就是CommonJS promise A标准的一种衍生。可以在jQuery中创建

$.Deferref的对象。同时也对发送ajax请求以及数据类型有了新的修改,参考JQuery API。

除了以上四种,javascript中还可以利用各种函数模拟异步方式,更有诡异的诸如用同步调用异步的case

只能用team里同事形容java和javascript的一句话作为结尾:

“写java像在高速路上开车,写javascript像在草原上开车”-------------以此来形容javascript这种无类型的语言有多自由
but,如果草原上都是坑。
参考技术A

举个生活中的示例就会很明白:

如:

早上起床,先刷牙,再烧水,等水烧开了洗脸,再整理发型.是同步

先刷牙,再烧水,再整理发型,等水壶滴的一声通知我水烧开了,我再取刚烧开的水洗脸,是异步.

实现方式可参考代码:

<script>
var flag = false;
function funcTest(t,func)
  setTimeout(function()
   (function(param)
     console.log(param);
     func();
   (t));
   ,t*1000);

var funcList = [];
funcList.push(function()funcTest(4,function()
  flag = true;//同步标记量
));//不同的异步函数添加进队列
funcList.push(function()funcTest(3,function()
  flag = true;
));//不同的异步函数添加进队列
funcList.push(function()funcTest(2,function()
  flag = true;
));//不同的异步函数添加进队列
dealFuncSync(funcList);
function dealFuncSync(funcList)
  function callBackSync()
   if(!funcList||funcList.length==0)
     console.log('end');
     return;
   
   flag = false;
   funcList.shift()();
   setTimeout(function()
      if(flag) //控制队列函数同步
       callBackSync();
      else
       setTimeout(arguments.callee,100);
      
   ,100);
  
  callBackSync();

</script>

参考技术B 同步的话,必须这个操作完了才会执行下一步,在等待期间浏览器会挂起不能执行任何接下来的js代码;异步则是【告诉】浏览器去做,【告诉】是一瞬间的事情,然后就继续执行下一步了,等到结果返回来了,浏览器会通知js执行相应的回调。

java中同步和异步有啥异同?

参考技术A

Java中交互方式分为同步和异步两种,异同情况如下:

同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程;

异步交互:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。 区别:一个需要等待,一个不需要等待,在部分情况下,我们的项目开发中都会优先选择不需要等待的异步交互方式。

Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。

扩展资料:

同步是用于确保资源一次只能被一个线程使用的过程,同步对于单线程程序没有任何好处。使用同步比非同步的性能差三到四倍。

线程都是独立的,而且异步执行,也就是说每个线程都包含了运行时所需要的数据或方法,而不需要外部的资源或方法,也不必关心其它线程的状态或行为。但是经常有一些同时运行的线程需要共享数据,此时就需考虑其他线程的状态和行为,否则就不能保证程序的运行结果的正确性。

需要做的是允许一个线程彻底完成其任务后,再允许下一个线程执行。必须保证一个共享的资源一次只能被一个线程使用。实现此目的的过程称为同步。

同步对于单线程程序没有任何好处。使用同步比非同步的性能差三到四倍。线程方法介绍: 

构造函数: 

Thread() 

Thread(Runable target) 

Thread(Runable target,String name) 

Thread(ThreadGroup group,Runable target) 

Thread(ThreadGroup group,Runable target,String name) 

Thread(ThreadGroup group,String name)

参考资料:百度百科-java

以上是关于javascript同步和异步的区别与实现方式的主要内容,如果未能解决你的问题,请参考以下文章

Ajax同步异步的区别

IO中同步与异步,阻塞与非阻塞区别(转)

java中同步和异步有啥异同?

在JavaScript中同步与异步

ajax同步请求与异步请求的区别

异步和同步的区别?