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. Junit 之 与Spring集成

    使用 Spring 测试注释来进行常见的 Junit4 或者 TestNG 的单元测试,同时支持访问 Spring 的 beanFactory 和进行自动化的事务管理.一.spring测试注解标签1. ...

  2. 模板std::mutex用法:

    std::mutex mymutex; std::lock_guard<std::mutex> lock(mymutex);

  3. C博客作业05--指针

    1. 本章学习总结 1.1 思维导图 1.2 本章学习体会及代码量学习体会 1.2.1 学习体会 这几周学习了指针,指针是C语言的一个重要的概念,也是特色之一.它可以通过对地址的访问来改变值,所以它的 ...

  4. Object.prototype的成员介绍

    3.Object.prototype的成员介绍        Object.prototype是js中所有的对象的祖宗        Object.prototype中所有的成员都可以被js中所有的对 ...

  5. Josephina and RPG HDU - 4800

    A role-playing game (RPG and sometimes roleplaying game) is a game in which players assume the roles ...

  6. C# 开发AliYun(阿里云) 小蜜调用接口代码

    using System; using System.Collections.Generic; using Aliyun.Acs.Core; using Aliyun.Acs.Core.Excepti ...

  7. 网易cetus数据库中间件安装-读写分离版本

    安装前提:1.数据库主从关系要做好:2.授权用户登录要做好:3.mysql最大连接数设置好,不然会报连接错误:4.版本最好是5.6以上. 1.安装依赖 yum install cmake gcc gl ...

  8. 页面适配的小栗子 - github

    我模拟了一个QQ音乐的radiostation页面,用了媒体查询以及流式布局,页面大部分内容是js根据json生成的,使用了less来编写css样式表. 下面是仓库地址,感兴趣的小伙伴可以打开看看,将 ...

  9. 阿里云ECS相关

    RAM授权: https://help.aliyun.com/document_detail/28639.html 安全组: https://jingyan.baidu.com/article/afd ...

  10. BZOJ 4259 残缺的字符串

    思路 同样是FFT进行字符串匹配 只不过两个都有通配符 匹配函数再乘一个\(A_i\)即可 代码 #include <cstdio> #include <algorithm> ...