1. 异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理且更强大
  2. 异步是非阻塞的
  1. Promise里的函数是同步调用的,异步操作在执行器中执行
  2. var promise = new Promise(传一个函数)
  3. var promise = new Promise(function (resolve, reject)) {
  4. if(异步操作成功){
  5. resolve(value)
  6. } else {
  7. reject(error)
  8. }
  9. }

Promise的状态

  1. Promise的状态
  2. 实例对象中的一个属性 PromiseState
  3. 有三个状态:
  4. 1pending 初始状态
  5. 2pending = resolved/fullfilled 实现 操作成功
  6. 3pending = rejected 拒绝 操作失败
  7. tips:只会变为成功和失败两个状态,且一个promise对象只能改变一次,无论变为成功还是失败,都会有一个结果数据,成功的结果数据一般称为value,失败的结果数据一般称为reason
  1. promise状态发生改变,就会触发then()里的响应函数处理后续步骤

Promise对象的值

  1. 实例对象中的另一个属性 PromiseResult
  2. 保存的是异步任务失败/成功的结果
  3. resolve
  4. reject

Promise.resolve

  1. 如果传入的参数为非Promise对象,则返回的结果为成功promise对象
  2. 如果传入的参数为Promise对象,则参数的结果决定了resolve的结果
  3. let p1 = Promise.resolve(521)
  4. console.log(p1);
  5. let p2 = Promise.resolve(new Promise(resolve, reject) => {
  6. reject('Error')
  7. })
  8. p2.catch(err => {
  9. console.log(err)
  10. })

Promise.reject

  1. 无论传入什么参数,返回的结果都是失败
  2. let p1 = Promise.reject(521)
  3. console.log(p1);

promise.all

  1. promise.all可以将多个promise实例包装成一个新的Promise实例,同时,成功和失败的返回值是不同的,成功的时候返回的是一个结果数组,而失败的时候则返回最先被reject失败状态的值
  2. tips:要全部成功才返回一个成功结果的数组
  3. 碰到一个失败则直接返回第一个失败的结果
  1. let p1 = new Promise(function(resolve, reject) {
  2. resolve('success1')
  3. })
  4. let p2 = new Promise(function(resolve, reject) {
  5. resolve('success2')
  6. })
  7. let p3 = Promise.reject('error')
  8. Promise.all([p1, p2]).then(function(res){
  9. console.log(res);
  10. }).catch(err=>{
  11. console.log(err);
  12. })
  13. Promise.all([p3, p1]).then(function(res){
  14. console.log(res);
  15. }).catch(err=>{
  16. console.log(err);
  17. })
  18. Promise.all([p1, p3, p2]).then(res=>{
  19. console.log(res);
  20. }).catch(err=>{
  21. console.log(err);
  22. })

Promise.race

  1. 顾名思义,Promise.race就是赛跑的意思,意思就是说,Promise.race([p1,p2,p3])里面哪个结果获得的快,就返回哪个结果,不管结果本身是成功状态还是失败状态
  1. var promise1 = new Promise((resolve, reject)=> {
  2. setTimeout(function(){
  3. if(true){
  4. resolve('success')
  5. }else{
  6. reject('lose')
  7. }
  8. },1000)
  9. })
  10. var promise2 = new Promise((resolve, reject)=>{
  11. if(false){
  12. resolve('success2')
  13. }else{
  14. reject('lose2')
  15. }
  16. })
  17. Promise.race([promise1, promise2]).then(res=>{
  18. console.log(res);
  19. }).catch(err=>{
  20. console.log(err);
  21. })

改变对象的三种方式

  1. 1resolve函数
  2. 如果当前是pending就会变为resolved
  3. 2reject函数
  4. 如果当前是pending就会变为rejected
  5. 3、抛出错误
  6. 如果当前是pending就会变为rejected
  7. throw 'error'

一个promise指定多个成功/失败回调函数,都会调用吗?

  1. 只要状态发生改变则都会调用,状态没有改变则都不调用
  2. let p1 = new Promise((resolve, reject)=>{
  3. resolve('123')
  4. })
  5. p1.then(resolve => {
  6. console.log(resolve);
  7. })
  8. p1.then(resolve => {
  9. console.log(resolve);
  10. })

Promise的链式调用

  1. let p = new Promise((resolve, reject)=>{
  2. resolve('123')
  3. })
  4. p.then(value => {
  5. return new Promise((resolve, reject)=>{
  6. resolve('success')
  7. })
  8. }).then(value => {
  9. console.log(value);
  10. }).then(value => {
  11. console.log(value); //undefined 状态为成功,但是因为上面没有返回值 所以返回值为undefined
  12. }).then(value => {
  13. console.log(value); //undefined
  14. })

promise异常穿透现象

  1. 用于then的链式调用,在最后放一个.catch就可以了
  2. 不管是哪一步发生失败,都交由最后的catch处理
  3. let p = new Promise((resolve, reject)=>{
  4. resolve('123')
  5. })
  6. p.then(value => {
  7. return new Promise((resolve, reject)=>{
  8. resolve('success')
  9. })
  10. }).then(value => {
  11. console.log(value);
  12. }).then(value => {
  13. console.log(value);
  14. throw '出错啦'
  15. }).then(value => {
  16. console.log(value);
  17. }).catch(reason => {
  18. console.log(reason);
  19. })

中断promise链

  1. 有且只有一种方式,只有返回一个pending状态的promise对象
  2. 因为状态没有改变,所以后面的then执行不了
  3. let p = new Promise((resolve, reject)=>{
  4. resolve('123')
  5. })
  6. p.then(value => {
  7. return new Promise((resolve, reject)=>{
  8. resolve('success')
  9. })
  10. }).then(value => {
  11. console.log(value);
  12. }).then(value => {
  13. return new Promise(()=>{})
  14. }).then(value => {
  15. console.log(value);
  16. }).catch(reason => {
  17. console.log(reason);
  18. })

async和await

async是协同Promise工作的,放置在函数前面,返回一个Promise对象,关键词await可以让JavaScript进行等待,直到一个promise执行并返回它的结果,JavaScript才会继续往下执行,await只能在async定义的函数内部执行。

  1. async声明异步函数
  2. await会阻塞后面代码的执行
  3. 如果返回的是reject 则返回错误信息。后面代码不执行

async

  1. async function main() {
  2. // 如果返回值是一个非Promise类型的数据,那么返回的就是一个成功的Promise对象,并且你返回的值是什么,PromiseResoult的值就是什么
  3. return 521
  4. // 如果返回的是一个Promise 的对象,根据Promise的返回结果来判断,如果是resolve就是成功的,如果是reject就是失败的、
  5. return new Promise((resolve, reject)=>{
  6. reject('error')
  7. })
  8. // 如果是抛出异常,则Pormise状态为失败,并且返回值就是抛出异常的值
  9. throw 'error'
  10. }

await

  1. 1await右侧的表达式一般为Promise对象,但也可以是其他值
  2. 2、如果表达式是promise对象,await返回的是promise成功的值
  3. 3、如果表达式是其他值,直接将此值作为await的返回值
  4. 注意:
  5. 1await必须写在async函数中,但async函数中可以没有await
  6. 2、如果awaitpromise失败了,就会抛出异常,需要通过try...catch捕获处理

进程和线程

进程:就是在内存中正在运行的程序就叫一个进程 特点:在内存中独享一份空间
进程负责为程序的运行提供必备的环境(相当于工厂中的车间)

线程:一个应用程序是由多个线程组成,每一个线程之间是相互独立的
线程是计算机中最小的计算单位,负责执行进程中的程序

js是一个单线程 如果遇到耗时任务,而且同步,就会造成线程阻塞

  1. /* 同步的代码 线程被阻塞了 */
  2. console.log(1);
  3. alert("http")
  4. console.log(2)
  1. /* 回调函数处理耗时操作 */
  2. /* 异步 */
  3. console.log(1)
  4. setTimeout(()=>{
  5. console.log("http")
  6. },1000)
  7. console.log(2)