promise总结

1.promise是什么?

1.1.1抽象表达

promise 是JS中进行异步编程的新的解决方案
旧的方案:纯回调形式

1.1.2.具体表达

从语法来说:promise是一个构造函数
从功能来说:promise对象用来封装一个异步操作并可以获取结果

1.2状态改变:

pending变为resolved
pending变为rejected
说明:只有这2种,且一个promise对象只能改变一次
无论变为成功还是失败,都会有一个结果数据
成功的结果数据一般称为value,失败的结果数据一般称为reason

1.3常见的内置错误

1.错误的类型:

ReferenceError :引用的变量不存在
TypeError:数据类型不正确的错误,
RangeError数据值不在其所允许的范围内
SyntaxError:语法错误

2.错误处理

捕获错误:try...catch
抛出错误:throw error

3.错误对象

message属性:错误相关信息
stack属性:函数调用栈记录信息

2.为什么要用promise?

1.指定回调函数的方式更加灵活:

旧的必须在启动异步任务前指定
promise:启动异步任务 =》 返回promise对象 =》 给promise对象绑定回调函数(甚至可以在异步任务结束后指定)

2.支持链式调用,可以解决异步回调地狱问题

什么是回调地狱?

  • 回调函数嵌套调用,外部回调函数异步执行的结果是嵌套的回调函数 执行的条件

  • 第二个异步任务是以第一个异步任务为前提,第三个 异步任务是以第二个异步任务为前提

    回调地狱的缺点?
    不便于阅读 / 不便于异常处理

    解决方案:
    promise链式调用
    终极解决方案:async/await

3.promised的API

all所有成功才成功,有一个失败就失败
race以第一个执行完的为最终结果

4.promised的问题

4.1.如何改变promise的状态?

(1) resolve(value):  pending变为resolved
(2) rejecte(reason):  pending变为rejected
(3) 抛出异常:pending变为rejected

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

当 promise改变为对应状态 时都会调用

4.3.改变promise状态 和指定回调函数谁先谁后?

(1) 都有可能,正常情况下是先指定回调函数再改变状态,但是也可以先改变状态再指定回调函数

(2) 如何先改变 状态再指定回调?
在执行器中 直接调用resolve()/reject()
延迟更长时间才调用then()

(3)什么时候才能得到数据?
如果先指定回调,当状态发生改变时,回调函数就会调用,得到数据
如果先改变转态,那指定 回调时,回调函数就会调用,得到数据

.then是同步
里面调用 的resolve,reject都是异步函数,怎么验证?
在先改变状态 ,后指定回调函数的例子里 最后加入console.log("-----------------------");
先输出-------------------则resolve,reject是异步

4.4.promise.then()返回新的promise的结果状态由什么决定?

  • (1)简单表达:由 then()指定的回调函数执行的结果决定

  • (2)详细表述:

    如果抛出异常,新promise变为rejected,reason为抛出的 异常
    如果返回值是非promise的任意值,新promise变为resolve,value为返回 的值
    如果返回的是另一个新的promise,此promise的结果会成为新的promise的结果

4.5.promise如何串联多个 操作任务?

  • (1)promise的then()返回一个新的promise,可以变成then()的链式 调用

  • (2) 通过then的链式调用串联多个同步/异步操作

    输出结果:
    执行 任务1(异步)
    任务1的结果: 1
    执行任务2(同步)
    任务2的结果: 2
    执行任务3(异步)
    任务3的结果: 3

为什么有同步有异步,却按顺序执行?

    因为每一个任务都是拿到前一个 的返回结果才执行

4.6.promise异常传/穿透?

(1)当时有promise的then链式调用时,可以在最后指定失败的回调
(2)前面任何操作出了异常,都会传到最后失败的回调中

4.7.中断promise链?

  • (1)当前使用promise的then链式调用时,在中间中断,不再调用后面的回调函数

  • (2)办法:在回调函数中返回一个pendding状态的promise对象

5.async/await

1.async函数

  • 函数返回值为 promise对象
  • promise对象的结果由async 函数执行的返回值决定

2.await 表达式

  • await 右侧的表达式一般为promise对象 ,但是也可以是其他值
  • 如果表达式为promise对象,await返回的是promise成功的值
  • 如果表达式 是其他值,直接将此值作为await的返回值

3.注意:

  • await 必须写在async 函数中 ,但async函数可以没有await
  • 如果await 的promise 失败了,就会抛出异常,需要通过try…catch来捕获 处理
  • async 函数里return 2 也是返回的promise
  • !!!是async不是await,await是 可以返回它本身的
  • await只能得到成功的结果
  • try catch可以得到失败的结果

6.宏队列与微队列

  • 宏列队:用来保存待执行的宏任务(回调),比如:定时器回调、DOM 事件回调、ajax 回调
  • 微列队:用来保存待执行的微任务(回调),比如:promise的回调、MutationObserver 的回调

你可能感兴趣的:(ES6)