js单线程和异步,promise给的承诺

     话题有点大,对于关注前端圈圈的朋友,这个话题也有点落入俗套,作为森阿姨的第一篇掘金文,还但愿能写出一点新鲜感和小启迪。森阿姨保证绝对原创。
     咱们都知道,js的世界是单线程执行的,也就是说一个任务完成以后才能进行另外一个任务,这是由于js是运行在宿主进程多脚本语言,好比浏览器,好比node,宿主进程只会为其分配一个js引擎线程。那么对于耗时比较长的操做,若是继续等,也许会很受伤,用户体验大打折扣,待在那里啥也干不了。因此,咱们须要一些方法来避免等待耗时多的操做,这就引出‘异步’了吗,别急,引擎在没有执行和将要执行的时候,怎么知道这个操做的耗时长短呢?
     要真正的理解一个机制,最好的方法是,咱们尝试本身设计它。如今,停下来,咱们来本身想想,若是咱们开发浏览器引擎,咱们该怎么作?
     不少东西,咱们天天都在写,浏览器引擎天天都在数以亿计的机器上运行,看起来那么天然,天然到咱们忘了去想这背后的道理和逻辑,而认为这就是本该如此的,咱们甘之如饴地享受着前人给的一切,忘了咱们最初打开编辑器,敲下第一行代码时候的梦想。
     你生气了,也许要问,若是是我,干脆多线程多好,为何不采起多线程执行js呢?大部分语言都是多线程的,好比c++,好比java,你也许在去茶水间洗杯子的时候,听到后端的rd小哥哥在面试候选者的时候,老是要问怎么解决的线程间通讯。但是,但是他们java啥的是面向不一样的操做任务和数据的,而咱们写的html,css以及js,根原本讲是面向网页的,说到底,是操做浏览器的dom元素的。而浏览器渲染dom元素,最怕的就是重绘与回流,而多线程来操做dom,必然致使更高的复杂度,以及更高几率的重绘与回流。
     浏览器在解析的时候,已经把任务分了2类:同步任务、异步任务。js的单线程指的是同时只有一个js任务在运行,其余的同步任务会被放到后面排队等待,异步任务会被放到消息队列中。浏览器自己并非单线程的,它还有EventLoop轮询线程、UI渲染线程、网络请求线程......等等其余不少线程在作不一样的任务。同步任务直接进入js解析线程排队执行,异步任务会被执行线程挂起,进入消息队列,经过回调函数来告知主线程本身的任务结束了,不用在等了,这样主线程就会把这个任务也放到等待执行的队列。咱们会在不少文章中看到‘执行栈’这个词,这个词森阿姨不想用,由于咱们都知道栈的特色是先进后出,而这个js的执行,是先来先服务。而‘执行栈’这个词在这里,表明的不是js任务,而是为了这些任务的执行,分配的内存空间。计算机的好处就是诚恳,全部的一切都是这样井井有理,不会向人类,没有执行完,先喊一声执行结束了,什么插队啊加塞啊,通通不存在的,全部的任务都按照预先设置好的规则层次分明的运行。
     咱们的cpu速度远远高于网络I/O传输的速度,在数据驱动以及mvvm普及的今天,大量的异步操做充斥在咱们代码中,一个又一个的回调,让咱们的代码没有设计感又难于复用和维护。
     在es6中,promise终于被提了出来,成为浏览器原生支持的方法,咱们认为这本质也是一种语法糖,es6中不少东西均可以看做语法糖。没有这颗糖,咱们的生活依旧能够继续,咱们能够很快的写出知足业务需求的逻辑和代码,赚工资养家。但是,但是人生苦短,只有你甜,只有你甜。甜一点,有什么很差呢,又有什么好呢?咱们不得不学习各类新技术、看各类文章、接触各类新名词,不少前端老人苦不堪言,不少前端新手菜鸟弯道超车。
     先说回调函数的缺点:1)回调地狱,繁琐;2)代码结构混乱,同步任务和异步任务堆叠交杂;3)与设计感无关,没法使用先进的设计模式;4)全部的函数和逻辑经过回调实现,不方便其余模块复用;5)重复和冗余。
     promise能够把异步过程串行起来写,例如:css

new Promise(testFunction).then(function (result) {
        
    }).catch(function (reason) {
        
    }).then(function (result) {
        
    }).catch(function (reason) {
        
    }).then(function (result) {
        
    }).catch(function (reason) {
        
    });
复制代码

     从这段代码中,咱们能够看到异步操做就像同步操做同样,也顺序的被写在一个个的.then以后,即便咱们不写返回值,promise的每一步也都有一个默认的返回值,叫作:undefined。
     promise是符合A+规范的,咱们也能够本身实现promise,而且使用A+规范来测试它。
     promise有3中状态:pending(进行中)、resolved(解决)、rejected(失败),这个promise翻译成中文能够叫作承诺,由于只要达到来解决或者拒绝,就不会再改变。它诚恳又有分寸,它终究不是人,它只是那么单纯。html

相关文章
相关标签/搜索