JS是单线程语言,多数的网站不需要大量计算,程序耗时主要是在磁盘I/O和网络I/O上 ,虽然固态硬盘SSD读取很快,但是和CPU比起来却不在一个数量级上,而且网络上的一个数据包来回时间更慢,所以一些CPU直接执行的任务就是主线程任务优先执行,随之就有了同步任务(主线程排队执行的任务前一个执行完毕才执行下一个)和异步任务(不进入主线程,而进入任务队·task queue·,等主线程执行完才开始执行)之分。任务队列又分为microtask(①process.pbservw②promise③Object.observer④MutationObserve)和macrotask(setTimeout、setInterval和setImmediate、i/o和UI渲染)

每个事件循环event loop会有一个以上task queue==macrotask queue 值得注意的是每个包裹在script标签中的代码也是一个macrotask。

事件循环的顺序决定了js代码执行的顺序,它从整体代码开始第一次循环,之后全局上下文进入函数调用栈,直到调用栈清空,只剩下全局,然后执行所有的micro task.当所有的micro task执行完毕循环再次从macro task开始找到其中一个任务队列执行完毕,然后执行再执行micro task,这样一直循环下去

ex1:

const promise =new promise((resolve,reject)=>console,log(1);resolve();console.log(2));

  promise.then(()=>{

    console.log(3);

});

console.log(4);

结果是1  2  4  3(因为promise.then中的函数是异步执行的)

ex2:

const promise1 =new promise((resolve,reject)=>{

  setTimeout(

  ()=>{resolve('success')}

  ,100)

})

const promise2 = promise1.then(

()=>{throw new Error('erro')}

)

console.log('promise1',promise1)

console.log('promise2',promise2)

setTimeout(()=>{

console.log('promise1',promise1)

console.log('promise2',promise2)

},2000)

结果是 :promise1 Promise{<pending>}

promise2 Promise{<pending>}

(node:50928) ....

因为promise有三种状态,状态一旦改变就凝固不可逆 上面的promise2并不是promise1 而是返回一个新的Promise实例

ex3:const promise = new Promise(()=>{

resolve('success'),

reject('error')

})

Promise.then((res)=>{

console.log('then':res)

}).catch((err)=>{

console.log('catch',err)

})

结果:then:success1

构造函数中的resolve或reject 只有第一次执行有效,多次调用是没有效果的,因为其状态一旦改变就凝固

另外链式操作可以用return this 实现 promise 每次调用.then 或.catch都会返回一个新的promise从而实现了链式操作。

Promise的.then和.catch的参数期望值是函数,传入的非函数则会发生值穿透

事件循环起始于all scripts 是属于task(macro task)然后在主线程run 期间将ticks promise压入miscro task ,setTimeout压入macro task剩下的cobnsole.log直接执行,然后开始执行一遍micro task 这是考虑ticks优先级大于promise 所以输出s ticks在前,当micro task执行完了又去执行一个macro task 然后又清Micro task一遍再去执行macro task 如此循环

promise用法十道题的更多相关文章

  1. 嵌入式系统Linux内核开发工程师必须掌握的三十道题(转)

    嵌入式系统Linux内核开发工程师必须掌握的三十道题 如果你能正确回答以下问题并理解相关知识点原理,那么你就可以算得上是基本合格的Linux内核开发工程师,试试看! 1) Linux中主要有哪几种内核 ...

  2. c/c++ 多线程 等待一次性事件 std::promise用法

    多线程 等待一次性事件 std::promise用法 背景:不是很明白,不知道为了解决什么业务场景,感觉std::async可以优雅的搞定一切的一次等待性事件,为什么还有个std::promise. ...

  3. ES6语法 promise用法

    ES6语法 promise用法 function doSomething(){ return new Promise((resolve,reject)=>{ resolve('jjjj');// ...

  4. es6的promise用法详解

    es6的promise用法详解 promise 原理 promise是es6的异步编程解决方案, 是es6封装好的对象: 一个promise有三种状态:Pending(进行中).Resolved(已完 ...

  5. [WinJS] Promise 用法

    初学 WinJS, 可能对 Promise 的用法不大清楚,本文简要说明一下 WinJS中 promise 的基本用法. 主要参考自:http://try.buildwinjs.com/#promis ...

  6. Es6 Promise 用法详解

     Promise是什么??    打印出来看看  console.dir(Promise) 这么一看就明白了,Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方 ...

  7. ES6 Promise 用法讲解

    Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方法,原型上有then.catch等同样很眼熟的方法. 那就new一个 var p = new Promise( ...

  8. Promise 用法

    Promise是一个构造函数,自己身上有all.reject.resolve这几个眼熟的方法,原型上有then.catch等同样很眼熟的方法. 那就new一个 Promise的构造函数接收一个参数,是 ...

  9. ES6 Promise用法讲解

    所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果. ES6 规定,Promise对象是一个构造函数,用来生成Promise实例. 下面代码创造了一个 ...

随机推荐

  1. [ISSUE] [Centos] Centos Start Nginx Show: Failed to start nginx.service:unit not found

    CMD Line:systemctl start nginx.serviceFailed to start nginx.service: Unit not found. Solution: 1.vim ...

  2. arcgis for js 之 获取两点之间的距离

    换了新公司,接触新行业,半路出家,看着别人的代码,看着api慢慢理解. 需求如下:已知两点坐标求距离. 思路,没有,站在同事的肩膀上踩路子,给的这个链接 https://developers.arcg ...

  3. 基于PLC1850平台的ARP包请求与响应

    一.以太网ARP报文格式 ①.以太网目的地址:占6个字节(接收方的MAC地址,不清楚时发广播地址:FF-FF-FF-FF-FF-FF) ②.以太网源地址:占6个字节(发送方的MAC地址) ③.帧类型: ...

  4. C语言输出

    转自:https://blog.csdn.net/u014647208/article/details/53337315 int PrintVal = 9; /*按整型输出,默认右对齐*/ print ...

  5. debugging kubernetes (Delve and Goland)

    1. Build from source cd GOPATH mkdir k8s.io cd k8s.io git clone https://github.com/kubernetes/kubern ...

  6. uploadify上传图片的使用

    一:引用jquery.uploadify.js 二:代码 <body> <table> <tr> <td style="width: 15%; te ...

  7. iOS进阶之TCP代理鉴权过程

    这段时间接触了网络代理,而自己的任务是完成TCP和UDP的网络代理,所以在这里写些自己的理解吧. 这篇文章先介绍一下TCP代理的鉴权过程(采用的是用户名和密码鉴权),下一篇文章再介绍UDP代理的鉴权过 ...

  8. 【MySQL】InnoDB 内存管理机制 --- Buffer Pool

    InnoDB Buffer Pool 是一块连续的内存,用来存储访问过的数据页面 innodb_buffer_pool_size 参数用来定义 innodb 的 buffer pool 的大小 是 M ...

  9. centos7安装supervisor

    安装supervisor cd /root/tools/ wget http://pnxcvm0bq.bkt.clouddn.com/get-pip.py python get-pip.py pip ...

  10. Codeforces 101623E English Restaurant - 动态规划

    题目传送门 传送门 题目大意 餐厅有$n$张桌子,第$i$张桌子可以容纳$c_i$个人,有$t$组客人,每组客人的人数等概率是$[1, g]$中的整数. 每来一组人数为$x$客人,餐厅如果能找到最小的 ...