转 js中的同步和异步 _


 自从读了研后,走上了学术之路,每天除了看论文就是做实验,最后发现自己还是喜欢开发呀,于是我又重回前端啦~

  隔了这么久没学前端,好像很多东西都忘了不少,而且不得不说前端的技术更新是真的快,接下来将会重新拾起前端的一点一滴,首先进入的是js的同步和异步的世界~

一、单线程

(1)单线程的概念  

  如果大家熟悉java,应该都知道,java是一门多线程语言,我们常常可以利用java的多线程处理各种各样的事,比如说文件上传,下载等,而JavaScript是否也可以支持多线程呢?

  答案是否定的,JavaScript是一门单线程的语言,因此,JavaScript在同一个时间只能做一件事,单线程意味着,如果在同个时间有多个任务的话,这些任务就需要进行排队,前一个任务执行完,才会执行下一个任务,比如说下面这段代码

 
(1)所有同步任务都在主线程上执行,行成一个执行栈
(2)主线程之外,还存在一个任务队列,只要异步任务有了结果,就会在任务队列中放置一个事件
(3)一旦执行栈中的所有同步任务执行完毕,系统就会读取任务队列,看看里面还有哪些事件,那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行
(4)主线程不断的重复上面的第三步

三、异步编程

    那么,怎么才能实现异步编程,写出性能更好的代码呢,下面有几种方式

(1)回调函数

    回调函数是实现异步编程最简单的方法啦,回调函数我们在使用ajax时应该用的很多啦,其实在使用ajax时,我们就用到了异步

1 2 3 4 var req = new XMLHttpRequest(); req.open("GET",url); req.send(null); req.onreadystatechange=function(){}

    req.send()方法是 AJAX  向服务器发生数据,它是一个异步任务,而 req.onreadystatechange()属于事件回调,借由浏览器的HTTP请求线程发起对服务器的请求,在请求得到响应之后触发请求完成事件,将回调函数推入事件队列等待执行

    其实像setTimeout,还有我们平时为元素绑定监听事件,和上面说的道理也是一样的

    回调函数的优点是简单、容易理解和部署,缺点是不利于代码的阅读和维护,各个部分之间高度耦合(Coupling),流程会很混乱,而且每个任务只能指定一个回调函数

(2)Promise

    一直以来,JavaScript处理异步都是以callback的方式,在前端开发领域callback机制几乎深入人心,近几年随着JavaScript开发模式的逐渐成熟,CommonJS规范顺势而生,其中就包括提出了Promise规范,Promise完全改变了js异步编程的写法,让异步编程变得十分的易于理解,同时Promise也已经纳入了ES6,而且高版本的chrome、firefox浏览器都已经原生实现了Promise,只不过和现如今流行的类Promise类库相比少些API

    Promise包括以下几个规范

  • 一个promise可能有三种状态:等待(pending)、已完成(fulfilled)、已拒绝(rejected)
  • 一个promise的状态只可能从“等待”转到“完成”态或者“拒绝”态,不能逆向转换,同时“完成”态和“拒绝”态不能相互转换
  • promise必须实现then方法(可以说,then就是promise的核心),而且then必须返回一个promise,同一个promise的then可以调用多次,并且回调的执行顺序跟它们被定义时的顺序一致
  • then方法接受两个参数,第一个参数是成功时的回调,在promise由“等待”态转换到“完成”态时调用,另一个是失败时的回调,在promise由“等待”态转换到“拒绝”态时调用,同时,then可以接受另一个promise传入,也接受一个“类then”的对象或方法,即thenable对象

    在使用Promise时,我们需要检测一些浏览器是否支持Promise

 
function wait(time) {
    return new Promise(function(resolve,reject) {
        setTimeout(resolve,time);
    });
}

    这个时候我们就可以使用Promise处理异步任务啦

 
wait(1000).then(function(){
    console.log(1);
})

    上面这个例子表示1秒后输出1,同样的道理,我们可以使用Promise进行更加复杂的操作,关于更多的操作,就不继续说啦,关于异步的实现,其实还有其它的一些方法,但是因为上面说的这两种方法用的比较多,所以就只说上面这两种了

    


__EOF__

 
  • 本文作者: Yellow-ice
  • 本文链接: 
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角【 Yellow_ice
    关注 - 2
    粉丝 - 57     我在关注他 上一篇: 
    下一篇: 

相关