前言 Promise 是一个很是简单的概念,即便你没有机会使用 Promise,你也可能阅读过一些关于 Promise 的文章。api
所谓 Promise,就是一个对象
,用来传递异步操做的消息。它表明了某个将来才会知道结果的事件(一般是一个异步操做
),而且这个事件提供统一的 API,可供进一步处理。数组
Promise的出现主要是解决地狱回调callback hell
的问题,好比你须要结果须要请求不少个接口,这些接口的参数须要另外那个的接口返回的数据做为依赖,这样就须要咱们一层嵌套一层,可是有了Promise 咱们就无需嵌套。promise
Promise 的价值在于使得异步代码以一个更可读的风格结构化,而不是因异步函数嵌套显得混乱不堪。接下来接触到 6 个你可能不知道的关于 Promise 的事。异步
开始列举以前,先看看怎么建立 Promise:函数
先来看下面两段代码有什么不一样:prototype
promise
仅仅就是一维回调函数的数组。然而这两段代码并不等价, 每次调用 then() 都会返回一个
forked promise
,所以,在A中若是func1中抛出异常,func2同样会执行,在B中是promise 的链式写法
,操做的是func1中返回的
新的 promise`,因为 func1 中抛出异常,这个 promise 被 rejected了,结果 func2 被跳过不执行了。
再来看下边的代码会 alert 什么?code
.then()
里面操做的是上个返回来的
新的promise
。 promise期待你的回调函数或者返回同一个结果,或者返回其余结果可是会被传给下一个回调。
再再看两段代码有什么不同:cdn
在A中,当第一个 then 抛出异常时,第二个 then 能捕获到该异常,并会弹出 ''啊哦 抛出错误了''。这符合只捕获来自上一级异常的规则。 在B中,正确的回调函数和错误的回调函数在同一级,也就是说,尽管在回调中抛出了异常,可是这个异常不会被捕获。事实上,B中的错误回调只有在 promise 被 rejected 或者 promise 自身抛出一个异常时才会被执行。对象
在一个错误毁掉中,若是没有从新抛出错误,promise 会认为你已经恢复了该错误,promise 的状态,会从新转变为resolved
,在下面的栗子中会弹出i am saved
, 是由于第一个then()中的错误回调函数被注释了没有从新抛出异常,换句话说下一级没法捕获到异常。blog
仅仅由于你已经在一个 then() 函数中执行过代码,并不意味着你不可以暂停 promise 去作其余事情。为了暂停当前的 promise,或者要它等待另外一个 promise 完成,只须要简单地在 then() 函数中返回另外一个 promise。
再再再来看最后一个栗子, 运行下面代码回弹出什么呢???
第一眼看上去像不像2,由于 promise 已是 resolved ,then() 会当即执行(同步)。然而,promise规范要求是全部回调都是异步的,因此alert 执行时 i 的值尚未被修改,值依旧是0。